how to show pdf file in asp.net c# : Search text in multiple pdf software Library cloud windows asp.net winforms class vba-excel2-part1811

VBA-Programmer efficacement Excel
Maj 2008
Point, Points
La collection points représente tous les points d'une série, l'objet point un seul de ces points. Sachez juste
qu’on ne peut pas ajouter un point à la collection Points.
Conseils généraux
Un peu de détente
Après ce parcours un peu fastidieux du modèle objet d'Excel, je vais un peu gloser sur les défauts habituels
que l'on rencontre souvent en VBA. On trouve cinq grandes familles de "développeurs" VBA-Excel.
L'enregistreur
C'est la famille la mieux représentée, car la méthode est simple. On lance l'enregistrement automatique pour
générer le maximum de code possible, puis on tente d'écrire le liant pour que l'ensemble fonctionne. Ce genre de
code est facile à identifier car les variables ne sont pas déclarées et encore moins typées, le code est extrêmement
lent, et une fois sur deux, la mise à jour de l'écran n'étant pas désactivée, le déplacement rapide de la sélection
peut rendre une taupe épileptique.
Le codeur fou
En général il possède une bonne connaissance de la syntaxe Excel. Le code est même souvent très propre.
Seulement comme il aime bien écrire des programmes, il se garde bien d'utiliser un seul raccourci pour alléger le
code. Ainsi pour remplir quatre cases d'un formulaire, il en profitera pour générer l'ensemble du formulaire à
chaque exécution au lieu d'utiliser un modèle.
Le mathématicien
Celui là ne pense pas qu'Excel puisse servir à autre chose que pour faire de la mise en page de tableau (la
preuve, cela s'appelle un tableur). Aussi ne va-t-il pas confier un calcul à un logiciel, alors qu'il peut les faire
dans le code.
Le navigateur
De la famille du grand Surfeur, il parcourt le Web à la recherche de bout de code qu'il pourrait copier pour
mettre dans son programme. Cela crée un code un peu disparate, avec des parties bien écrites et d'autres moins.
En général, ce genre d'application ne fait jamais bien ce qu'on lui demande, mais en échange, elle fait des tas de
choses dont on n'a pas besoin.
Le designer
Cette dernière espèce est très fréquente en VB. Enthousiasmé par la conception de formulaire, on y trouve
des boites de dialogue de toute beauté. Bien que la plupart des contrôles n'ait aucune utilité, reconnaissons que la
beauté de l'oeuvre peut laisser rêveur.
Les règles de bases
Poser le problème
L'écriture d'une application quel que soit le langage utilisé doit toujours commencer par une analyse de ce
que l'on veut faire. En général pour de la programmation Excel, on dispose d'une feuille Modèle (Template) dans
laquelle on va amener des données pour obtenir des résultats (calculs et/ou graphiques). Ces données sont soit
tirées d'un fichier, soit demandées à l'utilisateur. Dans le premier cas, l'interaction avec l'utilisateur devra être
minimisée voire interdite, dans le deuxième on écrira une application évènementielle.
Les variables
Penser toujours à déclarer vos variables avant de les utiliser et donnez leur un type le plus précis possible.
Faite attention à préciser le type après chaque variable, en VBA
Dim Var1, Var2 As Integer est différent de Dim Var1 As Integer, Var2 As Integer.
Minimisez toujours la portée de vos variables, afin qu'elles n'existent que là où elles sont utiles.
Libérer la mémoire dès que possible, en utilisant des tableaux dynamiques plutôt que fixes, libérer aussi les
objets.
Mettez dans des variables les propriétés dont vous avez besoin dans les boucles.
Page 21/44
Search text in multiple pdf - search text inside PDF file in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Learn how to search text in PDF document and obtain text content and location information
pdf select text; convert pdf to searchable text
Search text in multiple pdf - VB.NET PDF Text Search Library: search text inside PDF file in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Learn How to Search Text in PDF Document and Obtain Text Content and Location Information in VB.NET application
search pdf for text; select text pdf file
VBA-Programmer efficacement Excel
Maj 2008
Les fonctions
N'abusez pas des fonctions, n'appelez pas de fonction dans les boucles. En général, passez des paramètres et
n'utilisez pas des variables publiques. N'oubliez pas qu'une fonction peut modifier les paramètres passés ByRef
et donc retourner des valeurs par ses arguments. Demandez-vous toujours ce que vous avez besoin de récupérer,
ne récupérer pas un objet lorsqu'une adresse suffirait.
Les objets
Utilisez des blocs With lorsque vous avez besoin d'accéder à plusieurs propriétés / méthodes d'un objet.
Mettez dans des variables les objets que vous appelez fréquemment. Faites attention, certaines propriétés /
méthodes d'un objet renvoient un objet.
L'application
Pensez à désactiver le mode de calcul et la mise à jour d'écran. Remettez toujours l'objet Application dans
l'état où il était. Désactivez les évènements quand vous n'en avez pas besoin.
Sélection
Sauf lorsque c'est indispensable, n'utilisez pas les méthodes Select et Activate. Lorsque vous avez plusieurs
objets feuilles ou classeurs, utilisez des variables pour les nommer, n'utilisez pas l'objet "Sélection".
Utilisation d'un modèle
Pour simplifier la programmation, on utilise en général un modèle. Il est souvent inutile de programmer
toute la mise en forme d'un document, alors que l'on peut appeler un modèle contenant déjà :
La mise en page
Celle ci doit être relativement simple. Evitez le plus souvent de fusionner les cellules, ne surchargez pas vos
feuilles de motifs et de bordures. Lorsqu'il s'agit d'un formulaire avec lequel l'utilisateur doit interagir,
chercher à faire un formulaire fonctionnel et non une oeuvre d'art.
Les formules de calculs
Dans vos formules, utilisez des plages nommées si vous êtes amené à supprimer / insérer des cellules. Faites
attention aux références (relatives / absolues).
Les graphes
Il est possible de placer déjà des graphes mis en forme dans le classeur. Une bonne solution consiste à
utiliser pour les séries des plages nommées. Ainsi, le fait de nommer la plage lors de l'exécution remplira
automatiquement le graphique.
Les plages nommées
Nommez les plages spécifiques de la feuille à la création, sauf dans le cas où vous ne connaissez pas leur
taille. Utilisez des noms clairs et significatifs.
Techniques de programmation
Évènements
Utiliser l'argument Target
De nombreux évènements Excel passe un argument Target qui est un objet Range contenant la plage
concernée par l'événement. Cette plage peut être discontinue.
Intersection d'une plage avec Target
Dans l'exemple suivant, la fonction met une croix (un X) lorsque l'on clique sur une cellule de la plage
Nommée AjoutX
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Dim MaPlage As Range
Page 22/44
VB.NET PDF File Split Library: Split, seperate PDF into multiple
Divide PDF file into multiple files by outputting PDF file size. Split Split PDF Document into Multiple PDF Files Demo Code in VB.NET. You
select text in pdf reader; text select tool pdf
C# PDF File Split Library: Split, seperate PDF into multiple files
The following C# codes explain how to split a PDF file into multiple ones by PDF bookmarks or outlines. Split PDF Document into Multiple PDF Files in C#.
pdf select text; find text in pdf image
VBA-Programmer efficacement Excel
Maj 2008
Set MaPlage = Application.Intersect(Range("AjoutX"), Target)
If Not MaPlage Is Nothing Then MaPlage.Value = "X"
End Sub
Action sur une plage défini par Target
L'exemple suivant déclenche le calcul sur toutes les cellules dépendantes de la plage modifiée.
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim MaPlage As Range
On Error Resume Next
Set MaPlage = Target.Dependents
Err.Clear
If Not MaPlage Is Nothing Then
MaPlage.Calculate
End If
End Sub
Désactiver les évènements
Cela se fait avec Application.EnableEvents=False. Ceci est particulièrement utile pour les évènements
Change et SelectionChange qui peuvent facilement créer un événement en cascade. Par exemple le code suivant
est un événement en cascade.
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
ActiveCell.Offset(1).Value = 12
End Sub
Pour une exécution correcte, il faut écrire :
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Application.EnableEvents = False
ActiveCell.Offset(1).Value = 12
End Sub
Lire les informations d'un graphe
Dans un objet graphique, on peut utiliser les événements de la souris pour savoir sur quelle partie du
graphique se situe le pointeur. En elle-même la fonction suivante ne sert à rien, mais elle donnera une idée de la
programmation à suivre. Cette fonction affiche dans la StatusBar les informations récupérées lors du
déplacement de la souris.
Private Sub Chart_MouseMove(ByVal Button As Long, ByVal Shift As Long,
ByVal X As Long, ByVal Y As Long)
Dim MonElement As Long, Param1 As Long, param2 As Long
ActiveChart.GetChartElement X, Y, MonElement, Param1, param2
Select Case MonElement
Case xlChartArea
Application.StatusBar = "Zone de graphique"
Case xlChartTitle
Application.StatusBar = "Titre"
Case xlPlotArea
Application.StatusBar = "Zone de traçage"
Case xlLegend
Application.StatusBar = "Légende"
Case xlSeries
Application.StatusBar = "Série n° " & Param1 & "point n° " & param2
Case xlDataLabel
Application.StatusBar = "label de la série n° " & Param1 & "point n° "
& param2
Case xlLegendKey
Application.StatusBar = "légende de la série n° " & Param1
Page 23/44
C# PDF File Merge Library: Merge, append PDF files in C#.net, ASP.
deleting, PDF document splitting, PDF page reordering and PDF page image and text extraction C# Demo Code: Combine and Merge Multiple PDF Files into One in .NET.
convert pdf to word searchable text; search pdf files for text programmatically
VB.NET PDF Page Insert Library: insert pages into PDF file in vb.
Able to add and insert one or multiple pages to existing adobe PDF document in VB.NET. Add and Insert Multiple PDF Pages to PDF Document Using VB.
how to make a pdf file text searchable; searching pdf files for text
VBA-Programmer efficacement Excel
Maj 2008
End Select
End Sub
Application
N'oublions pas les fonctions de bases
Mise à jour d'écran Application.ScreenUpdating = False / True
Mode de calcul Application.Calculation= xlCalculationAutomatic / xlCalculationManual
Message d'alerte Application.DisplayAlerts= False / True
Vider le presse - papier Application.CutCopyMode= False
Bloquer les interactions souris-clavier Application.Interactive = False / True
Récupérer les paramètres internationaux
On utilise pour cela la propriété "International". Attention, cette propriété est en lecture seule. Il est
possible de modifier ces paramètres avec l'API Windows, mais pensez toujours alors à restaurer ces paramètres
avant l'arrêt de votre application.
Modifier les menus
Il est possible de supprimer des menus d'Excel lors de l'exécution, on utilise pour cela la collection
CommandBars de l'objet Application. Pour trouver les références d'un menu, il suffit de connaître sa position. La
barre de menu est CommandBars(1) les autres objets étant les barres d'outils. Il convient de faire preuve de
cohérence. Lorsque l'on cherche à supprimer l'accès ou la visibilité d'un menu, on supprime de même son
équivalent dans les barres d'outils et on bloque l'accès au menu "Outils-personnaliser".
Rappel : "Enabled" interdit l'accès, "Visible" masque l'élément
La fonction suivante désactive le menu "Insertion-Cellules", les boutons correspondant de la barre d'outils
et le menu "Outils-personnaliser".
Public Sub DesacInsertDelCell()
With Application
With .CommandBars(1)
'Menu insertion cellule
.Controls(4).Controls(1).Enabled = False
'Menu outils personnaliser
.Controls(6).Controls(12).Enabled = False
End With
With Application.CommandBars("Formatting")
.Controls(15).Enabled = False
.Controls(16).Enabled = False
End With
End With
End Sub
Classeur
Ouvrir un classeur
Selon un modèle
Workbooks.add("MonFichier.xlt")
N'ayant qu'une seule feuille
Workbooks.add(xlWBATWorksheet)
Avec un nombre fixe de feuille
Application. SheetsInNewWorkbook=4
Workbooks.add
Feuille
Page 24/44
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
Combine multiple specified PDF pages in into single one file. using RasterEdge.XDoc. PDF; VB.NET Demo code to Combine and Merge Multiple PDF Files into One.
pdf text search tool; how to search a pdf document for text
C# HTML5 PDF Viewer SDK to view, annotate, create and convert PDF
set PDF text font and size, bold and highlight text in easy PDF Editor empower C#.NET users to edit PDF pages with multiple manipulation functionalities
search multiple pdf files for text; how to make a pdf document text searchable
VBA-Programmer efficacement Excel
Maj 2008
Rendre les plages nommées spécifiques à leur feuilles
La macro suivante va affecter à chaque feuille les plages qui réfèrent à elle dans le classeur. Cette fonction
n'a pas de véritable utilité dans un code, mais elle va nous permettre de voir deux concepts intéressants.
Public Sub AffectNom()
Dim MaFeuille As Worksheet, LeNom As Name, Recup As Range
For Each LeNom In ActiveWorkbook.Names
If InStr(1, LeNom.RefersTo, "!") > 0 And InStr(1, LeNom.Name, "!") = 0
Then
Set MaFeuille = Worksheets(Mid(LeNom.RefersTo, 2, InStr(1,
LeNom.RefersTo, "!") - 2))
Set Recup = Application.Evaluate(LeNom.RefersTo)
Recup.Name = MaFeuille.Name & "!" & LeNom.Name
LeNom.Delete
End If
Next
End Sub
La première remarque est de remarquer que l'on ne peut pas renommer une plage pour la rendre spécifique.
Si j'avais utilisé la ligne LeNom.Name = MaFeuille.Name & "!" & LeNom.Name cela n'aurait pas eu d'effet. Il
est possible de changer le Nom pour un autre nom, mais pas par un nom spécifique.
La deuxième astuce est l'utilisation d'Evaluate. Cette fonction se retrouve souvent en VBA car elle permet
de combler de nombreuses lacunes de la programmation Excel. Dans le cas présent, je l'utilise pour convertir une
adresse en un objet Range.
N.B: Dans ce cas, Evaluate n'est pas nécessaire, la commande suivante fonctionne aussi :
Set Recup = Range(LeNom.RefersTo)
Gestion des erreurs
Celle-ci se pratique de la même façon que dans Visual Basic. Pour une raison que je n'ai toujours pas
comprise, beaucoup de développeurs VB la méprise, comme si son utilisation sous-entendait que le
programmeur va faire des erreurs. Sachez toutefois qu'elle est dans certains cas extrêmement rapide, et qu'il est
dommage de ne pas l'utiliser au nom d'une dogmatique tout à fait discutable. Prenons l'exemple suivant. Dans
mon classeur je cherche à savoir si la feuille "pilotage" existe. Je peux évidemment parcourir la collection des
feuilles pour la chercher, mais cela est assez lent. Le mieux est alors de faire :
Public Sub rempliTab()
Dim MaFeuille As Worksheet, Maplage As Range, compteur As Long
On Error Resume Next
Set MaFeuille = ActiveWorkbook.Worksheets("pilotage")
If Err.Number <> 0 Then
ActiveWorkbook.Worksheets.Add
After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count)
ActiveSheet.Name = "pilotage"
Set MaFeuille = ActiveSheet
Err.Clear
End If
On Error GoTo 0
Set Maplage = Worksheets("pilotage").Range(Cells(1, 1), Cells(20, 5))
For compteur = 1 To Maplage.Cells.Count
Maplage.Cells(compteur).Value = compteur
Next compteur
End Sub
Plage
Références dans les plages
Dans une plage définie, le système de référence est le même que pour une feuille, à savoir
Page 25/44
C# Create PDF from images Library to convert Jpeg, png images to
Component for combining multiple image formats into one or multiple PDF file in C#.NET. Any piece of area is able to be cropped and pasted to PDF page.
search text in pdf using java; pdf text searchable
VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.
NET PDF file & pages edit, C#.NET PDF pages extract, copy, paste, C#.NET rotate PDF pages, C#.NET search text in PDF Turn multiple pages PDF into multiple
pdf search and replace text; pdf editor with search and replace text
VBA-Programmer efficacement Excel
Maj 2008
MaPlage.Cells(Ligne,Colonne). La cellule supérieure gauche au sein de la plage prend l'adresse (1,1) et la cellule
inférieure droite la valeur MaPlage.Cells(MaPlage.Rows.Count,MaPlage.Columns.Count).
Regardons le cas suivant :
Public Sub rempliTab()
Dim Maplage As Range, compteur As Long
Set Maplage = Worksheets("pilotage").Range(Cells(1, 2), Cells(20, 6))
For compteur = 1 To Maplage.Cells.Count
Maplage.Cells(compteur).Value = compteur
Next compteur
MaPlage.Range(Cells(3,3),Cells(4,4)).Interior.ColorIndex=3
Maplage.Cells(1, 0).Interior.ColorIndex=4
End Sub
La référence MaPlage.Range(Cells(3,3),Cells(4,4)) renvoie une plage de quatre cellules dans le système
d'adresse de la plage, c'est à dire dans notre exemple égale à ActiveSheet. Range(Cells(3,4),Cells(4,5)), puisque
la plage commence à la colonne 2. Nous voyons à la ligne suivante que nous pouvons donner une adresse
extérieure à la plage. Dans notre cas le numéro de colonne 0 représente la colonne à gauche de la plage. Ceci
n'est pas sans inconvénients, car il n'y a pas de contrôle sur la présence d'une cellule dans la plage.
Donc en général l'adresse d'une cellule de l'objet Range se donne par Cells(Ligne, Colonne). Néanmoins
dans une plage continue, on peut utiliser juste le numéro d'index de la cellule au sein de la collection. Excel
donne ce numéro toujours dans l'ordre "à droite puis en bas". Ainsi le code ci dessus affichera "1" dans la cellule
B1, "5" dans la cellule F1, "6" dans la cellule B2 etc…..
Cette notation est très peu utilisée, mais elle peut permettre de parcourir une plage avec une seule boucle.
Pour passer d'un index à une adresse on emploie les formules suivantes :
Index Ligne, colonne
MaPlage.Cells(MonIndex\ MaPlage.Columns.Count+1,MonIndex mod MaPlage.Columns.Count)
Ligne, colonne Index
MonIndex=(Cellule.Row-1)*MaPlage.Columns.Count+Cellule.Column
Tableau contenant les valeurs ou les formules
Deux propriétés d'une plage peuvent être récupérées dans un tableau à partir d'une plage Value et Formula.
L'avantage de cette méthode est qu'il est beaucoup plus rapide de parcourir un tel tableau que d'énumérer une
grande collection de cellules. Dans le chapitre qui vient, nous allons regarder en détail le calcul sur les plages.
Pour pouvoir faire quelques tests de performance, je vais utiliser l'API "GetTickCount" qui renvoie le nombre de
millisecondes écoulées depuis le démarrage de ma session Windows. Mon code va donc se présenter ainsi :
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Public Sub TestEff()
Dim MaPlage As Range, Depart As Long
Application.Calculation = xlCalculationManual
Depart = GetTickCount
Set MaPlage = Range(Cells(1, 1), Cells(25000, 10))
.. 'code à tester
MaPlage.Calculate
MsgBox GetTickCount   Depart
End Sub
N.B : "Option Explicit" oblige la déclaration des variables.
Pour créer ma plage de tests je vais utiliser la formule Excel "=Ligne()*Colonne()" qui dans chaque cellule
multipliera le numéro de la ligne par celui de la colonne. Ma ligne de remplissage sera :
MaPlage.FormulaLocal = "=Ligne()*Colonne()"
Dans ce cas j'utilise FormulaLocal pour lui passer une formule appelant des fonctions en français, ce qui est
strictement équivalent à utiliser :
MaPlage.Formula = "=ROW()*COLUMN()"
En supposant par contre que la cellule A1 contienne déjà la formule ci-dessus, je pourrais recopier cette
formule avec AutoFill.
MaPlage.Cells(1).AutoFill Destination:=MaPlage
Page 26/44
VB.NET PDF Convert to Word SDK: Convert PDF to Word library in vb.
NET control to export Word from multiple PDF files in VB. Create editable Word file online without email. Supports transfer from password protected PDF.
search pdf files for text; how to make pdf text searchable
VBA-Programmer efficacement Excel
Maj 2008
Cependant le code suivant engendrera une erreur car AutoFill ne peut pas recopier une cellule dans deux
directions simultanément. Je devrais donc utiliser :
MaPlage.Cells(1).AutoFill Destination:=MaPlage.Rows(1)
MaPlage.Rows(1).AutoFill Destination:=MaPlage
Cette méthode est un peu plus lente que de faire :
MaPlage.Formula = MaPlage.Cells(1).Formula
Mais ayez déjà à l'esprit que le temps de remplissage de la plage représente environ 10% du temps de la
fonction (le reste étant le temps de calcul).
A ne jamais faire
Une autre méthode pourrait être de parcourir la collection des cellules et d'écrire :
For Each MaCellule In MaPlage.Cells
MaCellule.FormulaLocal = "=Ligne()*Colonne()"
Next
Seulement dans ce cas, le temps de traitement est multiplié par dix.
Utiliser un tableau (variant)
Comme je vous l'ai dit au début on peut affecter les valeurs d'un tableau à la propriété "Value" ou
"Formula" d'une plage. Je déclare mon tableau comme un Variant car certaines versions d'Excel n'acceptent pas
les tableaux typés du fait que le tableau peut contenir du texte. Regardons les trois codes suivants:
Public Sub TestEff()
Dim MaPlage As Range, Depart As Long
Depart = GetTickCount
Application.Calculation = xlCalculationManual
Set MaPlage = Range(Cells(1, 1), Cells(25000, 10))
MaPlage.FormulaLocal = "=Ligne()*Colonne()"
MaPlage.Calculate
MsgBox GetTickCount - Depart
End Sub
Public Sub TestEff()
Dim MaPlage As Range, Depart As Long
Dim MonTab As Variant, comptLig As Long, comptCol As Long
Depart = GetTickCount
Application.Calculation = xlCalculationManual
Set MaPlage = Range(Cells(1, 1), Cells(25000, 10))
ReDim MonTab(1 To MaPlage.Rows.Count, 1 To MaPlage.Columns.Count)
For comptLig = 1 To MaPlage.Rows.Count
For comptCol = 1 To MaPlage.Columns.Count
MonTab(comptLig, comptCol) = "=Ligne()*Colonne()"
Next comptCol
Next comptLig
MaPlage.FormulaLocal = MonTab
MsgBox GetTickCount - Depart
End Sub
Public Sub TestEff()
Dim MaPlage As Range, Depart As Long
Dim MonTab As Variant, comptLig As Long, comptCol As Long
Depart = GetTickCount
Application.Calculation = xlCalculationManual
Set MaPlage = Range(Cells(1, 1), Cells(25000, 10))
ReDim MonTab(1 To MaPlage.Rows.Count, 1 To MaPlage.Columns.Count)
For comptLig = 1 To MaPlage.Rows.Count
For comptCol = 1 To MaPlage.Columns.Count
MonTab(comptLig, comptCol) = comptLig * comptCol
Next comptCol
Next comptLig
MaPlage.Value = MonTab
MsgBox GetTickCount - Depart
End Sub
Page 27/44
VBA-Programmer efficacement Excel
Maj 2008
Le premier et le deuxième code font exactement la même chose, c'est à dire qu'ils mettent la formule de
calcul dans chaque cellule de la plage, mais le premier le fait cent fois plus vite. Il convient donc de ne pas
utiliser de tableau Variant sur les formules mais bien uniquement sur les valeurs.
Le premier et le troisième code donnent les mêmes résultats, mais une plage contient des formules, et l'autre
uniquement des valeurs. Par contre, la vitesse de traitement est strictement identique. Comme cette plage va me
servir de plage de valeur je peux donc utiliser indifféremment une des deux fonctions suivantes (la première
étant un peu plus rapide) :
Public Sub TestEff()
Dim MaPlage As Range
Dim MonTab As Variant, comptLig As Long, comptCol As Long
Set MaPlage = Range(Cells(1, 1), Cells(25000, 10))
ReDim MonTab(1 To MaPlage.Rows.Count, 1 To MaPlage.Columns.Count)
For comptLig = 1 To MaPlage.Rows.Count
For comptCol = 1 To MaPlage.Columns.Count
MonTab(comptLig, comptCol) = comptLig * comptCol
Next comptCol
Next comptLig
MaPlage.Value = MonTab
End Sub
Public Sub TestEff()
Dim MaPlage As Range
Set MaPlage = Range(Cells(1, 1), Cells(25000, 10))
MaPlage.FormulaLocal = "=Ligne()*Colonne()"
MaPlage.Value = MaPlage.Value
End Sub
A noter que la ligne MaPlage.Value = MaPlage.Value remplace les formules de la plage par les valeurs
(c'est l'équivalent d'un collage spécial valeur).
Nous allons continuer à évaluer l'utilisation de ces tableaux en faisant l'exercice suivant. Je pars donc de ma
plage et je veux que chaque cellule contienne la valeur Cellule*2+3. Dans ma feuille, j'ai nommé ma plage
précédente "PlageSource" (ce qui n'est pas original).
Calcul par la feuille
La première méthode consiste à faire le calcul par la feuille. J'utilise donc le code suivant :
Public Sub TestEff()
Dim Depart As Long, MaPlage As Range
Depart = GetTickCount
Application.Calculation = xlCalculationManual
'méthode1 calcul par feuille
Set MaPlage = Range("PlageSource").Offset(0,
Range("PlageSource").Columns.Count)
MaPlage.FormulaLocal = "=LC(-" & Range("PlageSource").Columns.Count &
")*2+3"
MaPlage.Calculate
Range("PlageSource").Value = MaPlage.Value
MaPlage.Clear
Set MaPlage = Nothing
MsgBox GetTickCount - Depart
End Sub
C'est une utilisation standard des feuilles de calcul, mais il faut être sûr d'avoir la place pour créer une plage
intermédiaire.
Calcul par collage spécial
Cette méthode est beaucoup plus originale. Dans mon exemple elle n'est pas logique d'emploi, mais sachez
qu'elle existe et qu'elle est aussi rapide que les autres.
Page 28/44
VBA-Programmer efficacement Excel
Maj 2008
Public Sub TestEff()
Dim Depart As Long, MaPlage As Range
Depart = GetTickCount
Application.Calculation = xlCalculationManual
Set MaPlage = Range("PlageSource").Offset(0,
Range("PlageSource").Columns.Count)
MaPlage.Value = 2
MaPlage.Copy
Range("PlageSource").PasteSpecial xlPasteValues,
xlPasteSpecialOperationMultiply
MaPlage.Value = 3
MaPlage.Copy
Range("PlageSource").PasteSpecial xlPasteValues,
xlPasteSpecialOperationAdd
MaPlage.Clear
Set MaPlage = Nothing
MsgBox GetTickCount - Depart
End Sub
Comme vous le voyez, je colle des plages de taille identique sur ma plage en lui faisant faire une opération
à chaque fois. Notez que dans ces deux codes, je libère l'objet Maplage en fin de fonction ce qui n'est pas
nécessaire puisque la variable va être détruite, mais ce qu'il ne faut pas oublier de faire dans une fonction plus
longue.
Calcul par tableau variant
Avec ce code je passe par un tableau en mémoire.
Public Sub TestEff()
Dim Depart As Long, MaPlage As Range, MonTab As Variant, comptLig As Long,
comptCol As Long
Depart = GetTickCount
MonTab = Range("PlageSource").Value
For comptLig = 1 To UBound(MonTab, 1)
For comptCol = 1 To UBound(MonTab, 2)
MonTab(comptLig, comptCol) = MonTab(comptLig, comptCol) * 2 + 3
Next comptCol
Next comptLig
Range("PlageSource").Value = MonTab
Erase MonTab
MsgBox GetTickCount - Depart
End Sub
Calcul par tableau avec Evaluate
Enfin cette dernière méthode utilise la fonction "Evaluate"
Public Sub TestEff()
Dim Depart As Long, MaPlage As Range, MonTab As Variant
Depart = GetTickCount
Application.ReferenceStyle = xlA1
MonTab = Application.Evaluate(Range("plagesource").Address(True, True,
xlA1, True) & "* 2 + 3")
Maplage.Value = MonTab
Erase MonTab
MsgBox GetTickCount - Depart
End Sub
Pour un bon fonctionnement de Evaluate, il faut que l'environnement Excel soit en mode A1.
Page 29/44
VBA-Programmer efficacement Excel
Maj 2008
Synthèse
Je vous donne ces différentes syntaxes car elles sont sensiblement équivalentes en vitesse. Selon les cas il
convient d'en utiliser une plutôt que l'autre, mais c'est à vous de savoir.
UsedRange et "SpecialCells(xlCellTypeLastCell)"
Il y a un piège potentiel lors de la recherche de la dernière cellule de la feuille. En pratique Excel définit
comme dernière cellule, la cellule de rang le plus élevé de la plage UsedRange. Regardons le code suivant
Range(Cells(1, 1), Cells(100, 10)).Value = "12"
Range(Cells(50, 1), Cells(100, 10)).Clear
MsgBox ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Address
La boite de dialogue va renvoyer l'adresse J100, pourtant la dernière cellule non vide est la cellule J49. Ceci
vient du fait qu'Excel ne remet pas à jour automatiquement l'adresse de la dernière cellule lors d'un effacement.
Pour forcer cette mise à jour, il faut faire appel explicitement à la propriété UsedRange. Dès lors le code correct
est :
MsgBox ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Address
N.B : L'appel de UsedRange déclenche toujours la mise à jour de la dernière cellule.
A la recherche des cellules vides
Voilà un grand classique de la programmation d'Excel. En fait plusieurs méthodes sont utilisables selon que
l'on souhaite savoir s'il y a des cellules vides ou si on veut pouvoir y accéder.
Etudions le cas ci-dessus avec le code ci-dessous :
Public Sub ChercheVide()
Dim MaPlage As Range, NbVide As Integer
NbVide = Application.WorksheetFunction.CountBlank(Range(Cells(1, 1),
Cells(16, 3)))
If NbVide>0 Then Set MaPlage = Range(Cells(1, 1), Cells(16,
Page 30/44
Documents you may be interested
Documents you may be interested