13 liens privés
Besoin :
Je veux ajouter un bouton à ma feuille de calcul Excel qui devrait appeler une macro pouvant gérer un agument.
Démarche :
Dans la fenêtre "Attribuer une macro" (cliquez avec le bouton droit sur l'objet et sélectionnez "Attribuer une macro"):
- Mettez le nom de la macro entre guillemets simples, par exemple pour passer 2 constantes: 'Button1_Click("A string!", 7)'
- Sélectionnez "Ce classeur" pour le champ "Macros dans"
- Si vous souhaitez passer une variable (comme la valeur d'une cellule), placez le paramètre dans Evaluate ()
Par exemple, pour transmettre la valeur de Sheet1!$A$1 à une fonction de bouton, vous auriez le texte suivant dans le champ 'Nom de la macro:':
Button1_Click(Evaluate("Sheet1!$A$1"))
Dim DebutExecutionMacro As Date
DebutExecutionMacro = Now
MsgBox "L'onglet Synthèse du fichier " + NomFichierCible + " est (re)créé." + vbLf + vbLf + _
"Temps d'exécution : " & Format(Now - DebutExecutionMacro, "hh:mm:ss")
Pour un répertoire /
Dim RepertoireExiste As Boolean
If Len(Dir(Repertoire, vbDirectory)) > 0 Then
RepertoireExiste = True
Else
RepertoireExiste = False
MsgBox "Le répertoire n'existe pas pour ce RUN." & vbLf & Repertoire, vbExclamation + vbOKOnly
Exit Function
End If
Ne pas oublier l'attribut vbDirectory
. C'est grâce à lui que la fonction Dir()
sait qu'on est sur un répertoire.
Pour un fichier :
Dim FichierExiste As Boolean
If Len(Dir(Repertoire & ModeleNomFichier)) > 0 Then
FichierExiste = True
End If
Alternatives, en utilisant la référence Microsoft Scripting Runtime
sous Excel
Dim FS As Scripting.FileSystemObject
Set FS = New Scripting.FileSystemObject
If Not FS.FolderExists(Repertoire) Then
MsgBox "Le répertoire n'existe pas" + vbCrLf + Repertoire, vbCritical, "Répertoire inexistant"
Exit Function
End If
Pour un fichier, utiliser FS.FileExists(Repertoire + "\" + Fichier)
.
Worksheets("Synthèse").Range("A1", Cells.SpecialCells(xlCellTypeLastCell)).EntireColumn.AutoFit
Ca permet d'accélérer le temps de traitement des macros, sans faire clignoter l'écran, ni avoir besoin d'interagir avec l'utilisateur pour confirmer manuellement les actions du code VBA (ex. : demande de confirmation pour la fermeture d'un classeur sans enregistrement ; demande de confirmation pour écraser un fichier à l'enregistrement ; demande confirmation pour supprimer des données ; etc.).
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Ne pas oublier de repasser les valeur à True
en fin de traitement, sinon l'affichage restera figé.
Workbooks.OpenText Repertoire & "\" & FichierCSV, xlWindows, 1, xlDelimited, , , , True, , , , , , , , , , True
Le 2nd True
signifie que le séparateur utilisé est un point-virgule.
Alternative :
Workbooks.Open Filename:=CheminFichierSource & NomFichierSource
Range(Cells(1, 1), Cells.SpecialCells(xlCellTypeLastCell)).Copy
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, semicolon:=True
En théorie, la combinaison de touches ctrl+fin positionne le focus sur la cellule la plus en bas à droite d'une feuille de calcul.
En pratique, cette combinaison de touches sélectionne la cellule sans tenir compte des suppressions de contenu. Il en résulte que si :
- ma dernière cellule est en C4
- je saisis quelque chose en E7
- la combinaison ctrl+fin m'envoie en E7
- je supprime la cellule E7
- la combinaison ctrl+fin m'envoie en E7
- je me positionne sur A1 puis enregistre le classeur
- la combinaison ctrl+fin m'envoie maintenant en C4
Le code VBA correspondant à la combinaison de touches ctrl+fin est Cells.SpecialCells(xlCellTypeLastCell)
.
Pour trouver la dernière ligne aillant eu un saisie, le code VBA correspondant est :
Cells.SpecialCells(xlCellTypeLastCell).Row
Le code suivant permet de trouver la dernière ligne non vide pour une colonne donnée (ici la colonne F).
Cells(Rows.Count, "F").End(xlUp).Row
Pour programmer la mise en pause de l'exécution d'une macro, il suffit de saisir l'instruction Stop
à l'endroit voulu dans le code.
Lancer une macro excel via une tâche planifiée ... Utiliser un script vbs plutôt qu'un script bat.
Set AppExcel = CreateObject("Excel.Application")
With AppExcel
.Visible = True
Set Wb = .Workbooks.open("D:\Outils\Controle d'habilitations\Controle d'habilitations.xlsm")
.Run "controleLiens"
.Quit
end With
Quelques références à ajouter dans l'éditeur VBA pour Excel en fonction des besoins :
- Microsoft Scripting Runtime --> gestion du système de fichier et des dictionnaires en VB (table de clefs/valeurs)
- Microsoft XML --> gestion des fichier XML
- Microsoft VBScript Regular Expressions --> Expressions régulières
- Microsoft ActiveX Data Objects Library --> Manipulation de fichiers encodés en utf8
- Selenium Type Library --> pilotage de navigateur web (nécessite d'installer selenium et les bons pilotes pour les navigateurs visés)