C'est un appel implicite à la méthode Evaluate. Il s'agit en fait d'un interpréteur (le même que celui qui interprète les
formules Excel). On peut faire des utilisations très complexes de cette méthode.
Par exemple:
Vba
MaValeur = Application.Evaluate("LOG(A1*3+2)")
Cela peut s'écrire aussi:
Vba
MaValeur = [LOG(A1*3+2)]
Notez qu'il n'y a pas de guillemets lorsqu'on utilise la notation crochets. L'interprétation des plages,
dans notre cas A1, demande que le système de référence soit homogène. Si ma feuille était en référence LC j'obtiendrais
une incompatibilité de type.
Sélectionnez toutes les cellules de la feuille.
Effectuez un Clic droit.
Sélectionnez l'option "format de cellule" dans le menu contextuel.
Sélectionnez l'onglet Protection.
Décochez l'option "Verrouillée".
Cliquez sur le bouton OK pour valider.
Nota:
Sous Excel 2007, cette opération peut également être effectuée directement depuis la feuille de calcul.
Après avoir sélectionné les cellules : Onglet Accueil dans le ruban / Menu "Format" dans le groupe
"cellules" / Cliquez sur l'option "Verrouiller la cellule".
Refaites la manipulation inverses pour reverrouiller.
Lorsque l'icône du cadenas est en surbrillance, cela signifie que la cellule est verrouillée.
Ensuite, sélectionnez uniquement la plage de cellules que vous souhaitez protéger.
Effectuez un Clic droit.
Sélectionnez l'option "format de celllule" dans le menu contextuel.
Sélectionnez l'onglet Protection.
Cochez l'option "verrouillée".
Cliquez sur le bouton OK pour valider.
Ensuite, utilisez le menu Outils /Protection / Protéger la feuille .
Assurez vous que l'option "protéger la feuille et le contenu des cellules verrouillées" est cochée.
Saisissez votre mot de passe (en option).
Cliquez sur le bouton OK pour valider.
Des erreurs peuvent parfois apparaître dans les formules de calcul.
L'erreur peut être la conséquence d'une saisie erronée, mais peut parfois aussi être inévitable: Exemple des formules dans un tableau
de bord prérempli et complété à chaque fin de mois. Les cellules contenant des formules pour les prochains mois peuvent logiquement
renvoyer une erreur car les données ne sont pas encore renseignées.
Excel dispose de plusieurs outils qui permettent d'identifier et gérer ces erreurs. Il est intéressant de connaître la signification
les codes d'erreur, de cerner la cause et pouvoir ainsi trouver une solution corrective plus facilement.
Ce n'est pas toujours une nécessité, mais cela permet d'accélérer le code. Sur les grandes collections,
il convient d'éviter l'énumération qui est très lente.
Comparez la rapidité d'exécution du code entre
Vba
Dim ObjCell As Range
ForEach ObjCell InRange("A1:J65535").Cells
ObjCell.Value= ObjCell.Value*2+3Next
et
Vba
Dim Montab As Variant, cmpt1 As Long, cmpt2 As Long
Montab =Range("A1:J65535").ValueFor cmpt1 =LBound(Montab, 1) ToUBound(Montab, 1)
For cmpt2 =LBound(Montab, 2) ToUBound(Montab, 2)
Montab(cmpt1, cmpt2) =Montab(cmpt1, cmpt2) *2+3Next cmpt2
Next cmpt1
Range("A1:J65535").Value= Montab
Le deuxième code s'exécute environ 20 fois plus vite.
Il existe globalement deux types de recopies. La recopie incrémentée (AutoFill) et la non-incrémentée. Une recopie
incrémentée consiste à recopier une plage en incrémentant une des propriétés suivantes
* xlFillDefault : laisse excel choisir l'incrément
* xlFillSeries : Recopie avec les paramètres de la série si ceux-ci existent
* xlFillCopy : Sans incrément (utilisez plutôt la méthode Fill)
* xlFillFormats : Recopie le format sans les valeurs
* xlFillValues : Utilise l'incrément par défaut, mais ne recopie pas les formules
* xlFillDays : Incrémente les jours
* xlFillWeekdays : Incrémente les noms de jours
* xlFillMonths : Incrémente les mois
* xlFillYears : Incrémente les années
* xlLinearTrend : Tendance linéaire
* xlGrowthTrend : Tendance géométrique
Evidemment la recopie doit pouvoir trouver la valeur de l'incrément, il faut donc que la source contiennent au moins deux cellules.
La recopie non incrémentée utilise une des méthodes Fill directionnelles: FillDown, FillUp, FillLeft, FillRight.
Il faut que la cellule opposée au sens contienne une valeur ou une formule.
Sélectionnez la plage de cellules.
Appuyez sur la touche F5 du clavier.
Cliquez sur le bouton "Cellules".
Sélectionnez "Constantes".
Cochez le ou les types de données à supprimer (texte, nombre ...).
Cliquez sur le bouton "Ok".
Les cellules correspondantes sont sélectionnées.
Vous pouvez alors appuyer sur la touche "Suppr" du clavier pour supprimer le contenu des cellules tout en conservant
les formules dans la plage initialement sélectionnée.
Sélectionnez la ou les cellules à paramétrer.
Ensuite, utilisez le menu Données/Validation.
Sélectionnez l'onglet Options.
Dans le champ Autoriser:, sélectionnez la ligne "Longueur du texte".
Dans le champ Données:, sélectionnez la ligne "inférieure ou égale à".
Dans le champ Longueur:, précisez le nombre de caractères à autoriser dans les cellules sélectionnées.
Cliquez sur le bouton OK pour valider.
Désormais, un message d'alerte s'affiche lorsque vous saisissez un nombre de caractères supérieur à la valeur paramétrée.
Sélectionnez toutes les cellules de la feuille
Clic droit dans la feuille
Format de cellule
Onglet Protection
Décochez l'option "Verrouillée"
Cliquez sur le bouton OK pour valider
Menu Edition
Atteindre
Cliquez sur le bouton 'Cellules'
Sélectionnez l'option 'Formules'
Cliquez sur le bouton OK pour valider
Clic droit dans la feuille (assurez vous que les cellules contenant des formules
sont toujours sélectionnées)
Format de cellule
Onglet Protection
Cochez l'option "Verrouillée"
Cliquez sur le bouton OK pour valider
Ensuite, protégez la feuille. Seules les formules seront protégées en écriture.
Nota:
Pour sélectionner les cellules contenant des formules dans Excel2007:
Onglet 'Accueil'
Groupe 'Edition'
Cliquez sur la commande 'Rechercher et sélectionner'
Bouton 'Atteindre'
Cliquez sur le bouton 'Cellules'
Sélectionnez l'option 'Formules'
UsedRange (premier exemple).
Cet exemple envoie le nombre de lignes renseignées dans la feuille, où qu'elles soient.
Si les lignes 1 à 10 et 17 à 19 sont vides, mais que les lignes 11 à 16 et 20 à 24 sont renseignées, le résultat est 11 (6 + 5).
Vba
Dim NbLignes As Integer
NbLignes = ActiveSheet.UsedRange.Rows.Count
Nota:
Pensez à adapter le type de variable utilisé.
Dans l'exemple précédent, un message d'erreur (dépassement de capacité) survient si la procédure renvoie plus de 32767 lignes.
UsedRange (2eme exemple).
Renvoie le numéro de la première ligne renseignée dans la feuille.
Vba
Dim LaPremiereLigne As Integer
LaPremiereLigne = ActiveSheet.UsedRange.Row
CurrentRegion (premier exemple).
Cette propriété Définit une plage de toutes les cellules contiguës, délimitées par les premières lignes et colonnes vides.
Ici la procédure renvoie la dernière ligne de la Plage.
S'il n'y a pas de ligne vide dans la plage de données, que la cellule "Cel" se trouve dans la
plage de données, la macro renvoie la dernière ligne de la plage de données, non de la feuille.
Vba
Dim DerniereLigne As Integer
DerniereLigne =Range(Cel).CurrentRegion.End(xlDown).Row
CurrentRegion (deuxième exemple).
Renvoie l'adresse de la plage des cellules contiguës:
Vba
Dim strPlage AsString
strPlage =Range("A15").CurrentRegion.Address(False, False)
'Exemple:"A4:N25"
Range(Col 65536).End(xlUp)
Renvoie la dernière ligne renseignée dans la colonne spécifiée.
Pour connaître le numéro de la dernière ligne absolue renseignée dans la colonne A, utilisez:
Vba
Dim DerniereLigne As Integer
DerniereLigne =Range("A65536").End(xlUp).Row
Range("A1").End(xlDown)
Renvoie le numéro de la dernière ligne, avant la première cellule vide, en descendant à partir de la cellule spécifiée.
Vba
Dim DerniereLigne As Integer
DerniereLigne =Range("A1").End(xlDown).Row
Un autre exemple qui renvoie le numéro de la dernière ligne, avant la première cellule vide de la colonne C,
en partant de la cellule C15:
Vba
Dim DerniereLigne As Integer
DerniereLigne =Range("C15").End(xlDown).Row
Range(...).SpecialCells(xlCellTypeLastCell)
Renvoie la dernière ligne absolue non vide dans la feuille.
Attention: Si des lignes sont supprimées dans la plage, enregistrez préalablement le fichier pour que la
procédure renvoie la réelle dernière ligne (idem pour les colonnes supprimées).
Vba
Dim DerniereLigne As Integer
DerniereLigne =Range("A1").SpecialCells(xlCellTypeLastCell).Row
Range(...).SpecialCells(xlCellTypeLastCell).Address
Renvoie l'adresse absolue de la dernière cellule renseignée dans la feuille:
Vba
Dim AdresseAbsolue AsString
AdresseAbsolue =Range("A1").SpecialCells(xlCellTypeLastCell).Address
Pour transformer une plage verticale de cellules sous forme de plage horizontale:
Sélectionnez votre tableau.
Effectuez un "Copier".
Sélectionnez ensuite une cellule vide sous le tableau.
Menu Edition/Collage spécial
Cochez l'option "Transposé" dans la boîte de dialogue.
Cliquez sur le bouton OK pour valider.
Chaque mot séparé par un espace sera inséré dans une cellule différente.
Sélectionnez la cellule ou la plage de données sources.
Utilisez le menu Données/Convertir.
Sélectionnez l'option "Largeur fixe".
Cliquez sur le bouton "Suivant".
A l'étape suivante, vous pouvez modifier manuellement la scission entre les données.
Cliquez sur le bouton "Suivant".
Paramétrez le type de données et la cellule de destination.
Cliquez sur le bouton "Terminer".
Vous pouvez aussi créer des formules pour extraire les mots contenu dans la cellule.
Si par exemple les données sont en A1, saisissez cette formule en B1, puis utilisez la poignée de recopie
vers la droite.
'ExtraitlesdonnéesséparéesparunespacedanslacelluleA1SubextractionMots()
DimTableau() AsStringDim i As Integer
'découpelachaineenfonctiondesespaces""'lerésultatdelafonctionSpliteststockédansuntableau
Tableau =Split(Range("A1"), "")
'bouclesurletableaupourvisualiserlerésultatFor i =0ToUBound(Tableau)
'Lerésultats'affichedanslapremiereligne,à'partirdelacelluleB1.Range("A1").Offset(0, i +1) =Tableau(i)
Next i
EndSub
SubTest()
Deplace Range("K20")
EndSub'Positionnelacellulespécifiéedanslecoinsupérieurgauche'del'application.SubDeplace(Cellule As Range)
Dim Ligne As Integer, Colonne As Integer
Ligne = Cellule.Row
Colonne = Cellule.ColumnWith ActiveWindow
.ScrollRow= Ligne
.ScrollColumn= Colonne
EndWithEndSub
Cet exemple applique une couleur jaune dans les cellules fusionnées de la feuille nommée Feuil1.
Vba
SubVisualiserCellulesFusionnees()
Dim Cell As Range
'BouclesurlescellulesutiliséesdanslafeuilleForEach Cell InWorksheets("Feuil1").UsedRange.Cells'Silacelluleestfusionnée'ColorieenjaunesilacelluleestfusionnéeIf Cell.MergeCellsThen Cell.MergeArea.Interior.ColorIndex=6Next Cell
EndSub
La propriété d'identification des dépendants fonctionne uniquement sur la feuille active et ne peut pas suivre les références
distantes (sur les autres feuilles).
La procédure suivante recherche les dépendants d'une cellule dans toutes les feuilles du classeur.
Nota:
Cet exemple ne gère pas les cellules et les plages nommées.
Vba
OptionExplicitSubTest()
'ListelesdépendantsdelacelluleD4,danslaFeuil2
ListeDependents Worksheets("Feuil2").Range("D4")
EndSubSubListeDependents(Cellule As Range)
Dim Ws As Worksheet
Dim Plage As Range, Cell As Range, DirectDep As Range
Dim i As Integer, x As Integer
Dim Cible AsString, strDepenDent AsString, strRefer AsString'LalistedesdépendantsvaêtrestockéedansunecollectionDim Un AsNew Collection
'Activelafeuillecontenantlacelluleàcontrôler
Cellule.Parent.Activate
strDepenDent = Cellule.Parent.Name&"!"& Cellule.Address(0, 0)
'Vérifies'ilyadesdépendantsdirectsdanslafeuille:OnErrorResumeNext'Définitlaplagedecellulesdépendantes,danslafeuilleactiveSet Plage = Cellule.DirectDependents.CellsOnErrorGoTo0IfNot Plage IsNothingThen'BouclesurlesdépendantscontenusdanslafeuilleactiveForEach DirectDep In Cellule.DirectDependents.Cells
Un.Add Cellule.Parent.Name&"!"& DirectDep.Address, _
Cellule.Parent.Name&"!"& DirectDep.AddressNext DirectDep
EndIfSet Plage =Nothing'Bouclesurlesautresfeuillesduclasseur:ForEach Ws In ThisWorkbook.Worksheets'SilafeuilleestdifférentedelafeuilleactiveIf Ws.Name<> Cellule.Parent.NameThenOnErrorResumeNext'DéfinitlaplagedecellulescontenantdesformulesSet Plage = Ws.UsedRange.SpecialCells(xlCellTypeFormulas)
OnErrorGoTo0'VérifiesilafeuillecontientdesformulesIfNot Plage IsNothingThen'BouclesurlescellulescontenantdesformulesForEach Cell In Plage
'Gestiondesréférencesrelativesetabsolues
Cible =Replace(Cell.Formula, "$", "")
'Vérifiesilenomdelafeuilleapparaitdanslaformule.IfInStr(1, Cible, Cellule.Parent.Name) >0Then'Vérifiesilaformulecontientuneréférencecorrespondantàla'celluleàcontrôler
i =0
i =InStr(1, Cible, strDepenDent)
'Silaréférenceesttrouvéeonl'intègredanslacollectionIf i >0AndNotIsNumeric(Mid(Cible, i +Len(strDepenDent), 1)) Then
Un.Add Ws.Name&"!"& Cell.Address, Ws.Name&"!"& Cell.AddressElse'RecherchedesréférencesdanslesplagesdecellulesFor x =1ToLen(Cible)
i =0
i =InStr(1, Cible, ":")
If i >0Then
strRefer =ExtractionReferences(Cible)
'Silacelluleàcontrôlersetrouvedanslaplage,'onl'intègredanslacollection.IfVerifIntersect(Cellule, Range(strRefer)) And _
InStr(1, Cible, Cellule.Parent.Name&"!"& strRefer) >0ThenOnErrorResumeNext
Un.Add Ws.Name&"!"& Cell.Address, Ws.Name&"!"& Cell.AddressOnErrorGoTo0ExitForEndIf
Cible =Mid(Cible, i +1)
ElseExitForEndIfNext x
'--------------EndIfEndIfNext Cell
EndIfEndIfSet Plage =NothingNext Ws
'BouclesurlacollectionquicontientlalistedesdépendantsFor i =1To Un.Count'Affichelerésultatdanslafenêtred'exécution(Ctrl+G)
Debug.Print Un.Item(i)
Next i
EndSub'ExtraitlesréférencesspécifiéesdanslesformulesFunctionExtractionReferences(Chaine AsString) AsStringDim i As Integer, j As Integer
Dim strPlage AsString, Caract AsString
i =InStr(1, Chaine, ":")
'Renvoielaréférenceavantlesdeuxpoints":"For j = i -1To1Step-1
Caract =Mid(Chaine, j, 1)
SelectCaseAsc(Caract)
Case48To57, 65To90, 97To122
strPlage = Caract & strPlage
CaseElse: ExitForEndSelectNext j
strPlage = strPlage &":"'Renvoielaréférenceaprèslesdeuxpoints":"For j = i +1ToLen(Chaine)
Caract =Mid(Chaine, j, 1)
SelectCaseAsc(Caract)
Case48To57, 65To90, 97To122
strPlage = strPlage & Caract
CaseElse: ExitForEndSelectNext j
ExtractionReferences = strPlage
EndFunction'Vérifiesilaréférenceextraitedanslaformuleauneintersection'aveclacelluledontoncontrôlelesdépendances.FunctionVerifIntersect(objDepend As Range, objReference As Range) As Boolean
Dim objRange As Range
Set objRange =Intersect(objDepend, objReference)
If objRange IsNothingThen
VerifIntersect =FalseElse
VerifIntersect =TrueEndIfEndFunction
Utilisez simultanément sur les touches clavier Ctrl+Maj+Fin.
Vous remarquerez que la dernière cellule est parfois au-delà de la plage de données utilisée. Supprimer tous ces
lignes et colonnes, entre cette cellule et la plage de données utile, permet:
* De ne pas imprimer des pages vides supplémentaires.
* De libérer de l'espace mémoire et donc de diminuer sensiblement la taille de votre classeur.
Vous devez activer la référence Microsoft DA0 3.6 Object Library pour
utiliser la bibliothèque DAO:
Dans l'éditeur de macros,
Menu Outils
Références
Cochez la ligne "Microsoft DA0 3.6 Object Library".
Cliquez sur le bouton OK pour valider.
Vba
SubDoCmdRunSQL(ByVal sql AsString, ByVal rDest As Range)
Dim db As DAO.DatabaseDim rs As DAO.RecordsetSet db = DAO.OpenDatabase(ActiveWorkbook.FullName, False, False, "Excel8.0;HDR=YES;")
Set rs = db.OpenRecordset(sql, DAO.dbOpenSnapshot)
rDest.CopyFromRecordset rs
Set rs =NothingSet db =NothingEndSub
Sélectionner la (les) cellule(s).
Menu Données.
Validation
Dans la liste déroulante "Autoriser:", choisissez "Personnaliser".
Dans le champ "Formule:", saisissez =""
Cliquez sur le bouton OK pour valider.
Nota:
Dans Excel2007, le menu validation est accessible depuis l'onglet "Données" dans le ruban. Ensuite cliquez sur le bouton
"Validation de données" dans le groupe "Outils de données".
Vous pouvez utiliser la fonction validation de données pour forcer la saisie de majuscules :
Menu Données.
Validation.
Cliquez sur l'onglet 'Options'.
Sélectionnez 'Personnalisé' dans le menu déroulant 'Autoriser'.
Dans le champ 'Formule', saisissez : =EXACT(A1;MAJUSCULE(A1))
Cliquez sur le bouton OK pour valider.
Si vous désirez également empêcher la saisie de valeurs numériques, ajoutez : =ET(EXACT(A1;MAJUSCULE(A1));ESTTEXTE(A1))
Dim Plage1 As Range
Set Plage1 =Range("A1").CurrentRegionMsgBox Plage1.Parent.Name&"!"& Plage1.Address
Remarque:
Parent renvoie Object, donc vous perdez l'intellisense et vous passez en liaison tardive.
Privilégiez l'utilisation de Worksheet qui renvoie un objet Worksheet. Donc vous gardez l'intellisense et en cas de pilotage
vous restez en liaison précoce:
Vba
Dim Plage1 As Range
Set Plage1 =Range("A1").CurrentRegionMsgBox Plage1.Worksheet.Name&"!"& Plage1.Address
Voici un petit code très simple qui permet de mettre un dégradé dans le fond d'une cellule. La macro se charge de créer
le rectangle aux bonnes dimensions et d'afficher le texte de la cellule en dessous en respectant la mise en forme.
La procédure gère plusieurs cellules d'une sélection et respecte la couleur de base de la cellule dans le dégradé, gère aussi les
cellules fusionnées.
Vba
SubDegrade()
Dim strAddr AsString, strAddrRC AsStringDim cell As Range, c As Range
ForEach cell In Selection.CellsIf cell.MergeCellsThen'cellulefusionnéeIf cell.Address= cell.MergeArea.Cells(1).AddressThenSet c = cell.MergeAreaElse'casoùlecadreadéjàététracéGoTo nextCell
EndIfElseSet c = cell
EndIf
strAddrRC = c.Address(True, True, xlR1C1, False)
strAddr = c.Address(False, False, xlA1, False)
With c
ActiveSheet.Shapes.AddShape(msoShapeRectangle, .Left, .Top, .Width, .Height).SelectEndWith'dégradé
Selection.ShapeRange.Line.Visible= msoFalse
Selection.ShapeRange.Fill.Visible= msoTrue
Selection.ShapeRange.Fill.ForeColor.RGB=Range(strAddr).Cells(1).Interior.Color
Selection.ShapeRange.Fill.OneColorGradient msoGradientHorizontal, 1, 0.39'texte
ExecuteExcel4Macro "FORMULA(""="& strAddrRC &""")"'alignementOnErrorResumeNextWith Selection
IfIsNumeric(c.Value) Then.HorizontalAlignment= xlRight
Else.HorizontalAlignment= c.HorizontalAlignmentEndIf.VerticalAlignment= c.VerticalAlignment.ReadingOrder= c.ReadingOrder.Orientation= c.Orientation.AutoSize=FalseWith.Font.Name= c.Font.Name.Size= c.Font.Size.ColorIndex= c.Font.ColorIndex.Underline= c.Font.Underline.Italic= c.Font.Italic.Bold= c.Font.BoldEndWithEndWithOnErrorGoTo0nextCell:
Next cell
Set c =NothingSet cell =NothingEndSub
Cette fonction enlève les caractères accentués de la chaîne passée en paramètre.
N.B :
Normalement, on ne met qu'une instruction de code par ligne, le caractère de fin de ligne étant le retour chariot.
Cependant, VBA interprète le caractère ":" (deux points) comme étant un séparateur d'instruction lorsqu'il est placé dans une
ligne sans en être le dernier caractère. Cette notation quoique valide est généralement à éviter pour des raisons de lisibilité
sauf quand le code est suffisamment trivial pour ne pas prêter à confusion.
Vous pouvez utiliser le raccourci clavier CTRL + Retour arrière.
L'application va positionner la cellule active dans l'angle supérieur gauche de la fenêtre.
Excel sait gérer des listes incrémentées dans vos feuilles de calcul. L'exemple classique est un mois saisi
dans une cellule et le mois suivant qui est automatiquement ajouté lorsque vous utilisez les poignées de recopie.
De plus, des listes personnalisées supplémentaires peuvent être mémorisées dans l'application.
Pour visualiser les listes existantes :
Utilisez le bouton Office.
Options Excel.
Menu Standard.
Cliquez sur le bouton "Modifier les listes personnalisées".
La liste de gauche présente les listes personnalisées existantes.
Cliquez sur l'élément "Nouvelle liste" pour créer une série incrémentée.
Saisissez le premier terme de la série, et appuyez sur la touche Entrée pour passer au terme suivant.
A la fin, cliquez sur le bouton "Ajouter" pour valider la liste.
Ce même bouton est utilisé lorsque vous souhaitez modifier une liste personnalisée.
Une liste personnalisée peut également être créée à partir du contenu d'une plage de cellules :
Sélectionnez les cellules depuis la boîte de dialogue et confirmez en cliquant sur le bouton "Importer".
Remarque :
Les entrées de la liste personnalisée sont considérées comme des données texte.
Par exemple, si vous avez une liste de données numériques, la première cellule de la série doit être au format texte.