« Macros-commandes VBA/Devenez un expert » : différence entre les versions

Contenu supprimé Contenu ajouté
intégration du contenu du cours Visual Basic
intégration du contenu du cours Visual Basic
Ligne 132 :
Les objets des experts permettent de programmer des problématiques délicates ou complexes
 
ExempleExemples : ObjectWorkbooks, WindowsWorksheets, WorkbooksSheets, WorksheetsRows, SheetsColumns, Object, Windows, Font , Interior , Offset, Calendar, Charts, Names, CommandBars, Rows, Columns, UserForms, ...
 
=== Les objets classeurs ===
 
Ouvrir un fichier avec trois feuilles déjà remplies pour y exécuter la macro :
<source lang="vb">
Sub Feuilles()
Dim Source, Destination As Excel.Workbook
Set Source = ActiveWorkbook
' Création
Workbooks.Add
Workbooks.Add After:=Sheets(Sheets.count) ' à la fin
Set Destination = ActiveWorkbook
' Copie d'une cellule dans un autre classeur
Destination.Sheets(1).Cells(1, 1) = Source.Sheets(1).Cells(1, 1) ' Avec bordures
Destination.Sheets(1).Cells(1, 2) = Source.Sheets(1).Cells(1, 2).Value ' Sans bordure
' Copie d'une feuille
Source.Sheets(1).Copy After:=Sheets(1)
' Copie d'une feuille dans un autre classeur
Source.Sheets(1).Copy After:=Destination.Sheets(1)
' Déplacement d'une feuille dans un autre classeur
Source.Sheets(1).Move After:=Destination.Sheets(1)
' Suppression
Source.Sheets(1).Delete
' Parcourir toutes les feuilles d'un fichier
For Each workheets In ActiveWorkbook.Worksheets
MsgBox workheets.Name
Next
End Sub
</source>
 
=== Les objets feuilles ===
 
Il faut définir une première plage, sur laquelle trier une deuxième :
 
<source lang="vb">
Sub classer()
' Tri sur la colonne C, du tableau AJ
Plage1 = "C" & EnteteLigne & ":C" & LigneFin
Plage2 = "A" & EnteteLigne & ":J" & LigneFin
 
With ActiveWorkSheet.Sort
.SortFields.Clear
.SortFields.Add Key:=Range(Plage1), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
.SetRange Range(Plage2)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
</source>
 
=== Les objets cellules ===
 
Ici on simule un copier-coller :
 
<source lang="vb">
' Copie de la première case dans la deuxième
Range("A1") = Range("B1")
' ou
Cells(1,1) = Cells(1,2)
' ou
Range("A1").copy
Range("B1").paste
Range("A2:C10").copy
 
Cells(l, c).Font.Size = 10 ' Taille du texte
Cells(l, c).Font.Bold = True ' Mise en gras
Cells(l, c).HorizontalAlignment = xlCenter ' Alignement
Cells(l, c).Font.Color = vbBlack ' Couleur de la police
' ou
Cells(l, c).Font.Colorindex = 2
Cells(l, c).Interior.ColorIndex = 4 ' Couleur de la cellule
Cells(l, c).Numberformat("$#,##0.00") ' Format monétaire
</source>
 
{{remarque|contenu=La commande .copy partage son presse papier avec l'utilisateur. Donc si la personne fait un copié-collé pendant que la macro tourne, il y aura des interférences.}}
 
<source lang="vb">
For Each c In ActiveCell.CurrentRegion.Cells
Cells(x + c.Row, y + c.Column).value = c.value
Next c
</source>
 
{{remarque|contenu=Le problème du ''copy/paste'' est qu'il utilise le même presse-papier que l'utilisateur. Il suffit donc de changer de cellule manuellement (ou de copier du texte) pour que les données du programme lui échappent. La solution consiste ici à balayer les cellules une par une}}
 
=== Les objets lignes ===
 
<source lang="vb">
Sub Lignes()
' Insertion d'une ligne 2 vierge
Rows(2).Insert
' Insertion après la ou les cellules sélectionnées
Selection.EntireRow.Insert
' Suppression
Rows(2).Delete
' Copie de toutes les lignes jusqu'à la fin du tableau en cours
ActiveCell.CurrentRegion.Copy
' Duplique la ligne L juste en dessous
Rows(L + 1).Insert Shift:=xlDown
Rows(L).Copy
Rows(L + 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub
</source>
 
=== Les objets colonnes ===
 
<source lang="vb">
Sub Colonnes()
' Insertion colonne 2
Columns(2).Insert
' Insertion après la ou les cellules sélectionnées
Selection.EntireColumn.Insert
' Suppression
Columns(2).Delete
End Sub
</source>
 
=== Les objets liens ===
 
La macro suivante placée dans une feuille crée automatiquement un hyperlien à chaque fois que l'on tape un mot dans une de ses cellules, vers sa définition du Wiktionnaire :
 
<source lang="vb">
Private Sub Worksheet_Change(ByVal Target As Range)
If Not IsNull(Target.Cells) And Not IsEmpty(Target.Cells) And TypeName(Target.Cells) = "Range" And Len(Trim(Target.Cells)) > 0 Then
ActiveSheet.Hyperlinks.Add Anchor:=Target.Cells, _
TextToDisplay:=Target.Cells.Value, _
Address:="https://fr.wiktionary.org/w/index.php?title=" & Target.Cells.Value
End If
End Sub
</source>
 
=== Les objets Word ===
 
La macro suivante placée dans une feuille ouvre automatiquement un fichier Word et écrit une nouvelle phrase :
 
<source lang="vb">
Ligne 141 ⟶ 276 :
Set ObjetWord = CreateObject("Word.Application")
ObjetWord.Visible = True
ObjetWord.Documents.Open App.Path & "\document.doc" 'Ouverture d'un fichier existant
ObjetWord.Documents.AddOpen App.Path & "\document.docx"
'Création d'un nouveau fichier
ObjetWord.Documents.Add
ObjetWord.Selection.TypeText "Texte écris." 'ou ObjetWord.Selection.TypeText Text:="Texte écris."
NomDuDocumentWord'Ajout de texte ObjetWord.SaveSelection.TypeText Text:="Texte écris." 'Sauvegarder
ObjetWord.PrintOutSelection.TypeText "J'écris une nouvelle phrase depuis EXCEL sur WORD." 'Imprimer
ObjetWord.Selection.TypeText Text="J'écris une nouvelle phrase depuis EXCEL sur WORD."
'Sauvegarder
NomDuDocumentWord.Save
'Imprimer
ObjetWord.PrintOut
'Quitter
ObjetWord.Quit
End Sub