Upload
trandieu
View
241
Download
5
Embed Size (px)
Citation preview
Les Boucles et Compteurs
Installe un compteur en A3Sub Compteur1()
For compteur = 1 To 200Range("A3").Formula = compteur
NextEnd Sub
Ajoute une valeur
Ajoute 100 aux valeurs de la colonne A dans la colonne Bet ceci pour les 10 premières cellules
Sub AjoutVAl()Dim MaValeur, nbcellFor nbcell = 1 To 10
Range("A" & nbcell).SelectMaValeur = ActiveCell.ValueRange("B" & nbcell).SelectActiveCell.Value = MaValeur + 100
NextEnd Sub
Incrémente un compteur
'Le mot clé Step permet d'incrémenter ou de décrémenter
Sub Total()For i = 2 To 10 Step 2Next iMsgBox "Le total est de " & i
End Sub
Compte les valeurs identiques
Sub ValeursIdentiques()Spinner = 0Set plageCherche = Application.InputBox(Prompt:="Sélectionner la plage de recherche", Type:=8)ValCherchée = Application.InputBox(Prompt:="Quelle valeur cherchez-vous?", Type:=1)For Each Item In plageCherche
If Item.Value = ValCherchée Then Spinner = Spinner + 1Next Item
MsgBox "Il y a " & CStr(Spinner) & " valeurs identiques"End Sub
Compte le nombre de cellules vides de la sélection.
Sub CountCellvide()numBlanks = 0For Each c In Selection
If c.Value = "" ThennumBlanks = numBlanks + 1
End IfNext cMsgBox "Il y a " & numBlanks & " cellules vides dans cette plage."
End Sub
Boucle pour parcourir une plage de cellules
'Utilise une boucle For Each...Next pour parcourir toutes les cellules d'une plage.'Arrondi à zéro tout nombre dont la valeur absolue est inférieure à 0,05.
Sub Zero()For Each Cellule In Range("A1:B10")
If Abs(Cellule.Value) < 0.05 ThenCellule.Value = 0
End IfNext
End Sub
Affecte une largeur de 5 points à une colonne sur deux de la sélection sur la Feuil1.
Sub LargeurColonne()For Each col In Selection.Columns
If col.Column Mod 2 = 0 Thencol.ColumnWidth = 5
End IfNext col
End Sub
Et pour une ligne (Toutes les 6 lignes):
Sub Ligne()Range("D1:D20").Select 'Exemple de sélection possibleFor Each col In Selection.Rows
If col.Row Mod 6 = 0 Thencol.RowHeight = 5
End If
Next colEnd Sub
Cherche une valeur non numérique
Sub Test()
'Dès qu'une valeur non numérique est trouvée, un message s'affiche et sort de la boucle.
For Each Cellule In Range("A1:B5")If IsNumeric(Cellule.Value) = False Then
MsgBox "La plage contient une valeur non numérique."Exit For
End IfNext
End Sub
Modifie la valeur des cellules d'une plage nommée "MaPlage"
Sub Modifie()Dim MaCellule As ObjectFor Each MaCellule In Range("MaPlage")
If MaCellule > 50 ThenMaCellule.Value = 1000
End IfNext MaCellule
End Sub
Et pour finir un compte à rebours qui déclenche l'exécution d'une macro
Sub CompteARebours()compteur = 5
'pour décrementer le compteur
For compteur = 5 To 0 Step -1 Range("b3").Formula = compteur
'Pour exécuter la macro dans 5 secondes!!!
nouvHeure = Hour(Now())nouvMinute = Minute(Now())nouvSeconde = Second(Now()) + 1Reprise = TimeSerial(nouvHeure, nouvMinute, nouvSeconde)Application.Wait Reprise
NextIf Range("b3").Value = 0 Then
'Exécution de la macro ici
Call Macro1End If
End Sub
Les Cellules
Déplace la cellule active d'une ligne vers le bas et deux colonnes vers la droite
Sub DéplaceCellActive()Dim LigVar, ColVarLigVar = 1ColVar = 2Selection.Offset(LigVar, ColVar).Select
End Sub
Sélectionne la cellule F1 et "scroll" l'écran
Sub SelectCell()Application.GoTo Reference:=ActiveSheet.Range("F1"), Scroll:=True
End Sub
Ajuste la colonne
Sub ajuste_colonne()Selection.Columns.AutoFit
End Sub
Redéfini la sélection à partir d'une plage nommée MySelect
Sub Redefini_Selection()Range("MySelect").Resize(rowsize:=1, columnsize:=5).Select
End Sub
Sélectionne toute la ligne à partir d'une plage nommée MySelect
Sub SelectionLigne()Range("MySelect").EntireRow.Select
End Sub
Sélectionne la zone courante et 1 colonne de plus - 2 méthodes
Sub SelectionZone_1ere()With Range("A1").CurrentRegion
Union(.Cells, .Offset(0, 1)).SelectEnd With
End Sub
Sub SelectionZone_2eme()With Range("A1").CurrentRegion
.Resize(, .Columns.Count + 1).SelectEnd With
End Sub
Supprime les lignes vides d'un tableau
Sub DétruireLigne()derniereLigne = ActiveSheet.UsedRange.Rows.CountApplication.ScreenUpdating = FalseFor r = derniereLigne To 1 Step -1
If Application.CountA(Rows(r)) = 0 Then Rows(r).DeleteNext r
End Sub
Supprime les lignes vides d'un tableau si la colonne C est vide
Sub DétruireLignesiC()derniereLigne = ActiveSheet.UsedRange.Rows.CountApplication.ScreenUpdating = FalseFor r = derniereLigne To 1 Step -1
If IsEmpty(Range("C" & r)) Then Rows(r).DeleteNext r
End Sub
Sub DeletesiCvide2() 'plus rapideWith Range("C1",Range("A65000").End(xlUp)).SpecialCells(xlCellTypeBlanks).EntireRow.DeleteEnd WithEnd Sub
Efface la ligne de la cellule active de valeur 0 d'une plage de cellule
Sub EffaceLigneVide()Range("D2").Select
'Sélection de la cellule de départ avec décalage sur les lignes(Offset(1,0))
Do Until ActiveCell = ""If ActiveCell = 0 Then
Selection.EntireRow.Clear
End IfActiveCell.Offset(1,0).Range("A1").Select
LoopRange("A1").Select
End Sub
Recherche une valeur, sélectionne la ligne de la valeur trouvée et supprime cette ligne avec message de confirmation
Sub SupLigValeur()Dim VarDim NumLgOn Error Resume NextVar = InputBox(Prompt:="Taper la valeur recherchée. ")Cells.Find(What:=(Var), After:=ActiveCell,LookIn:=xlFormulas, LookAt:=xlWhole,
SearchOrder :=xlByRows, SearchDirection:=xlNext, MatchCase:=False).ActivateWith Application.ActiveCell
NumLg = .RowEnd WithActiveCell.EntireRow.SelectStyle = vbYesNo + vbDefaultButton1Msg = "Suppression de la ligne N°: " & NumLgTitle = "Attention suppression de la ligne."Réponse = MsgBox(Msg, Style, Title)If Réponse = vbYes Then
Selection.Delete Shift:=xlUpElse
Exit SubEnd If
End Sub
Recherche un mot, sélectionne la ligne de la valeur trouvée et supprime cette ligne avec message de confirmation
Sub RechercheMot()Dim Var As StringOn Error Resume NextVar = InputBox("Mot à rechercher ?", , "zzzz")'pour ne rien supprimer en cas d' ECHAP ou D'ANNULERIf Var = "" Then Exit SubSet MotTrouvé = Cells.Find(What:=Var)If Not MotTrouvé Is Nothing Then
MotTrouvé.Select'confirmation de suppressionStyle = vbYesNo + vbDefaultButton1Msg = "Suppression de la ligne"Title = "Attention suppression de la ligne."Réponse = MsgBox(Msg, Style, Title)
If Réponse = vbYes ThenActiveCell.EntireRow.Select
Selection.Delete Shift:=xlUpEnd If
ElseMsgBox "Rien trouvé"Exit Sub
End If[A1].Select
End Sub
Teste si les cellules de la plage sont vides ou non vides et entre la formule indiquée dans la première cellule vide testée.
Sub Parcourir()Range("A1:A20").ActivateEn_Colonne = ActiveCell.ColumnEn_Ligne = ActiveCell.Row + 1While Not IsEmpty(ActiveCell.Value)
Cells(En_Ligne, En_Colonne).ActivateEn_Ligne = En_Ligne + 1
WendWith ActiveCell
ActiveCell.FormulaR1C1 = "Premiere cellule vide"Range("A11").Select
End WithEnd Sub
Compare les valeurs de 2 plages de cellules(Votant et Resultat)
Sub TestRésultat()Dim CellPtrDim XDim ZWorksheets("Résultats").SelectSet X = Range("Votant")Set Z = Range("Résultat")Z.SelectSelection.Interior.ColorIndex = xlNoneFor CellPtr = 1 To X.Count
If X(CellPtr) = Z(CellPtr) ThenZ(CellPtr).SelectWith Selection.Interior
.ColorIndex = 15
.Pattern = xlSolidEnd With
End IfNext CellPtrZ.SelectIf Selection.Interior.ColorIndex = 15 Then
MsgBox Prompt:="La plage Votant et la plage Résultat sont identiques. Il n'y a pas d'erreur."
Range("A1").Select
ElseMsg = " Vous devez corriger l'erreur ! "Style = vbCriticalTitle = " <<< Erreur trouvée >>>"Réponse = MsgBox(Msg, Style, Title, Help, Context)If Réponse = vbYes Then
Z.SelectEnd If
End IfEnd Sub
Colore en gris toutes les cellules dont les valeurs sont <30 de la plage E2:E65
Sub StockInf50()For Each Cell In Range("E2:E65")
If Cell.Value < 30 ThenCell.SelectWith Selection.Interior
.ColorIndex = 15
.Pattern = xlSolidEnd With
End IfNext
End Sub
Mets en majuscule la première lettre de la phrase de la sélection
Sub 1ereLettremajuscule()phrase = Selection.Valuephrase = UCase(Left(phrase, 1)) + Right(phrase, Len(phrase) - 1)Selection.Value = phrase
End Sub
Mets en majuscule toute la phrase de la sélection
Sub MinusculeMajuscule()Dim MotsCellule As StringMotsCellule = Selection.ValueMotsCellule = UCase(MotsCellule)Selection.Value = MotsCellule
End Sub
Mets en minuscule toute la phrase de la sélection
Sub MajusculeMinuscule()Selection = Evaluate("transpose(lower(transpose(" & Selection.Address & ")))")
End Sub
Fait la somme des chiffres écrits en rouge de la sélection
Sub sommeCouleurRougeText()Dim Cellule As RangeDim total As VariantFor Each Cellule In Selection
If Cellule.Font.ColorIndex = 3 Then
'3 rouge et 1 pour le noir
'If Cellule.Interior.ColorIndex = 3 Then (pour la couleur de fond)
If IsNumeric(Cellule) Then total = total + Cellule.ValueEnd If
NextMsgBox totalRange("G12") = total
End Sub
Compte le nombre de cellules colorées en rouge de la sélection
Sub NombredeCellRouge()Dim Cellule As RangeDim total As VariantFor Each Cellule In Selection
If Cellule.Interior.ColorIndex = 3 Then 'rougetotal = total + Cellule.Count
End IfNextMsgBox "Il y a " & total & " Cellules rouges"Range("A1") = total
End Sub
Personnalise les couleurs de la sélection suivant les valeurs RGB
Sub CouleurRGB()Range("a1").Interior.Color = RGB(0, 0, 0)Range("a2").Interior.Color = RGB(255, 0, 0)
End Sub
Cherche si la sélection contient une formule
Sub ChercheFormule()
'Dès qu'une formule est trouvée,'un message s'affiche et sort de la boucle.
For Each Cellule In Range("A1:B5")If Left(Cellule.Formula, 1) = "=" Then
MsgBox "La plage contient une formule."Exit For
End IfNext
End Sub
Trie les lignes et supprime les doublons.
Sub tridoublon()Worksheets("Feuil1").Range("A1").Sort key1:=Worksheets("Feuil1").Range("A2"),
_Order1:=xlAscending, Header:=xlGuess
Set MaCell = Worksheets("Feuil1").Range("A1")
Do While Not IsEmpty(MaCell)Set MaCellSuite = MaCell.Offset(1, 0)If MaCellSuite.Value = MaCell.Value Then
MaCell.EntireRow.DeleteEnd IfSet MaCell = MaCellSuite
LoopEnd Sub
Insére un commentaire dans une cellule.
Sub InsertionComment()Dim MyCmt As StringDim LaCell As Range
Set LaCell = Application.InputBox("Cliquez sur une cellule", Default:=ActiveCell.Address, Type:=8)MyCmt = InputBox("Inscrivez votre commentaire")On Error Resume Next
With LaCell.AddCommentWith .Comment.Visible = True.Text Text:=MyCmtEnd WithEnd WithEnd Sub
Formatage de tous les commentaires.
Sub FormatCommentaire()Dim wks As Worksheet, MyCmt As Comment
For Each wks In WorksheetsFor Each MyCmt In wks.Comments
MyCmt.Shape.OLEFormat.Object.AutoSize = True
With MyCmt.Shape.OLEFormat.Object.Font.Name = "Verdana".Size = 10.ColorIndex = 9.Bold = TrueEnd With
MyCmt.Shape.OLEFormat.Object.ShapeRange.Fill.ForeColor.SchemeColor = 35Next MyCmtNext wksEnd Sub
Masque (affiche) tous les commentaires.
Sub MSQCommentaire()Dim wks As Worksheet, MyCmt As Comment
For Each wks In WorksheetsFor Each MyCmt In wks.Comments MyCmt.Visible = False ' Masque le commentaire MyCmt.Visible = True ' Affiche le commentaireNext MyCmtNext wksEnd Sub
Masque (affiche) tous les commentaires. XP
Sub MsqXP()Application.DisplayCommentIndicator = xlCommentIndicatorOnlyEnd Sub
Sub AffXP()Application.DisplayCommentIndicator = xlCommentAndIndicatorEnd Sub
Supprime le nom utilisateur des commentaires
Sub SupNomAuthor()Dim NomAuthor As StringDim TxtComment As StringDim Commentaire As Comment
'Recupere le nom utilisateur
NomAuthor = ActiveWorkbook.BuiltinDocumentProperties(3)
For Each Commentaire In ActiveSheet.Comments
TxtComment = Commentaire.TextIf Left(TxtComment, Len(NomAuthor)) = NomAuthor Then
'+2 pour virer les 2 points ":"
TxtComment = Mid(TxtComment, Len(NomAuthor) + 2)
'Chr(10) pour virer la ligne vide
If Left(TxtComment, 1) = Chr(10) ThenTxtComment = Mid(TxtComment, 3)End IfEnd IfCommentaire.Text Text:=TxtCommentNext CommentaireEnd Sub
Ecrit les jours de la semaine (Sélectionner une cellule)
Sub JourSemaine()Dim semaine(1 To 7) As Stringsemaine(1) = "Lundi"semaine(2) = "Mardi"semaine(3) = "Mercredi"semaine(4) = "Jeudi"semaine(5) = "Vendredi"semaine(6) = "Samedi"semaine(7) = "Dimanche"For i = 1 To 7Selection.Offset(i - 1, 0).Formula = semaine(i)Next iEnd Sub
Crée un tableau Année - Trimestre (Sélectionner une cellule)
Sub TableauAnTrimestre()For An = 1 To 5Cells(1, An + 1).Value = 2000 + AnNext AnFor Trimestre = 1 To 4Cells(Trimestre + 1, 1).Value = "Trim" & TrimestreNext TrimestreEnd Sub
Ajoute la chaîne de caractères "Terminé" à la fin du texte de la cellule
Sub InserTermineDansCellule()Cells(1, 1).SelectWith Selection
.Characters(.Characters.Count + 1).Insert (" terminé")End WithEnd Sub
Associe 2 plages en un seul objet avec la méthode UNION
Sub UniondePlage()Dim plg1, plg2, ToutePlage As Range
Set plg1 = Sheets("Feuil1").Range("A1:A10")Set plg2 = Sheets("Feuil1").Range("B10:B20")Set ToutePlage = Union(plg1, plg2)
ToutePlage.Interior.ColorIndex = 5End Sub
Rempli l'union de deux plages avec la valeur 100
Sub RempliUnion()Worksheets("Feuil1").ActivateSet MaPlage = Application.Union(Range("A1:D10"), Range("F1:H12"))MaPlage.Value = 100End Sub
Sélectionne la cellule A154 de la Feuil1 et "Scroll" l'écran
Sub AllerA()Application.Goto Reference:=Worksheets("Feuil1").Range("A154"), Scroll:=TrueEnd Sub
Donne le numéro de ligne de la valeur cherchée
Sub NumeroDeLigne()NumeroLigne = Cells.Find("100").RowMsgBox NumeroLigneEnd Sub
Donne le nombre de lignes de la sélection
Sub NombreDeLigne()With SelectionMsgBox Selection.Rows.CountEnd WithEnd Sub
Macro pour modifier une formule (ici le nom de référence du classeur)
Sub ModifFormule()Application.SendKeys "{f2}"
'Envoie la touche F2
For I = 1 To 10
'Boucle pour mettre le curseur à gauche
Application.SendKeys "{gauche}"Next IApplication.SendKeys "{droite}"
'Pour écrire à droite du signe =
Application.SendKeys "{P}{r}{i}{x}{.}{x}{l}{s}{!}"Application.SendKeys "{ENTREE}"
'Valide la formule
End Sub
Cette macro affiche la formule écrite en A1 en A2
Il faut savoir que:Pour afficher une formule il faut entrer un espace ou une apostrophe (') devant la formule.Cette macro affiche la formule A1 en A2
Sub AfficheFormule()Range("A1").SelectSelection.CopyRange("A2").SelectSelection.PasteSpecial Paste:=xlFormulas, Operation:=xlNone,SkipBlanks:= False, Transpose:=False
Application.SendKeys "{f2}"
For I = 1 To 10 Application.SendKeys "{gauche}"Next I
Application.SendKeys "{droite}"
'inscrit un espace devant la formule
Application.SendKeys "{BS}"Application.SendKeys "{ENTREE}"End Sub
Affiche et sélectionne la référence d'une sélection
Sub BoiteSelectionZone()Dim Var As ObjectOn Error Resume NextSet Var = Application.InputBox(Prompt:="Sélectionner votre zone: (Ex. A1:B10) ", _Title:="Sélection de zone ", Default:="$A$1", Type:=8)On Error GoTo 0If Not (TypeName(Var) = "Rien") ThenMsgBox Var.AddressVar.SelectEnd IfSet Var = NothingEnd Sub
Donne le numéro de ligne aussi que la lettre de la colonne de la cellule active
Sub ColLigne()Colonne = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)Ligne = ActiveCell.RowMsgBox Colonne & LigneMsgBox ColonneMsgBox LigneEnd Sub
Formate la plage A1:A10 avec une procédure événementielle. (1 er - 2, 3, 4 etc...ème )
Mode d'emploi:Dans l'éditeur VB double-cliquez sur la feuille désiréeet coller tout le code suivant dans la partie droite.Modifiez la plage si besoin ici ----Intersect(Target, Range("A1:A10"))----A chaque modification des cellules de la plage (A1:A10) le format est mis automatiquement.
Private Sub Worksheet_Change(ByVal Target As Range)Dim Plage As RangeSet Plage = Intersect(Target, Range("A1:A10"))If Plage Is Nothing Then Exit SubFor Each cellule In PlageIf cellule.Value = 1 Thencellule.NumberFormat = "General"" er"""Else: cellule.NumberFormat = "General"" ème"""End IfNextEnd Sub
D'autres procédures événementielles.
Pour la feuil1
Private Sub Worksheet_Activate()MsgBox "La Feuil1 est activée"End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)MsgBox "DoubleClick effectué"End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)MsgBox "Click droit effectué"End Sub
Private Sub Worksheet_Change(ByVal Target As Range)MsgBox "La valeur a changée"End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)MsgBox "La sélection a changé"End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)MsgBox "DoubleClick interdit!"Cancel = TrueEnd Sub
Cherche un mot.
Sub SearchText()Dim SearchString, SearchChar, MyPosSearchChar = "salut"For Each cell In Range("A1:A11")SearchString = cell.TextMyPos = InStr(SearchString, SearchChar)
If MyPos > 0 ThenMsgBox ("Mot trouvé")MsgBox "Mot trouvé à cette adresse: " & cell.Addresscell(1, 2).Value = "(salut) est sur cette ligne"End IfNextEnd Sub
Comment récupérer la valeur d'une cellule,y faire une opération et renvoyer le résultat dans une autre ?
Sub RecupValeur()Dim Val1'Dim Resultat As Integer (pour un résultat en entier)Val1 = Sheets("Feuil1").[a1].ValueResultat = Val1 * 10Sheets("Feuil1").[a2].Value = (Resultat)MsgBox "Opération effectuée." & Chr(13) & Chr(13) _& "Résultat :" & CStr(Resultat)End Sub
Comment récupérer les valeurs d'une plage,y faire une opération et renvoyer le résultat dans une autre ?
Copie la plage A1:A15, ajoute 1 et colle dans la plage C1:C15
Sub CopiUnePlagedeValeur()Dim MaValeur, compteurFor compteur = 1 To 15Range("A" & compteur).SelectMaValeur = ActiveCell.ValueRange("C" & compteur).SelectActiveCell.Value = MaValeur + 1NextEnd Sub
Comment exécuter une macro si une cellule de la colonne A est sélectionnée?
Sub test_A()Colonne = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)If Colonne = "A" ThenMsgBox "Je lance la macro ici"ElseMsgBox ColonneEnd IfEnd Sub
Comment faire la somme des valeurs positives d'une plage contenant des valeurs négatives?
Somme des valeurs positives.
'avec somme.si:'=SOMME.SI(A1:A10;">0")
'Avec une fonction matricielle: (CTRL MAJ ENTREE)'{=SOMME(A1:A10*(A1:A10>0))}
Sub SommePositive()For Each Cell In Range("A1:A10")If Cell.Value > 0 Thentotal = total + CellEnd IfNextMsgBox "Total des valeurs positives " & totalRange("A11") = totalEnd Sub
Somme des valeurs négatives.
'avec somme.si:'=SOMME.SI(A1:A10;"<0")
'Avec une fonction matricielle: (CTRL MAJ ENTREE)' {=SOMME(A1:A10*(A1:A10<0))}
Sub SommeNégative()For Each Cell In Range("A1:A10")If Cell.Value < 0 Thentotal = total + CellEnd IfNextMsgBox "Total des valeurs négatives " & totalRange("A11") = totalEnd Sub
Comment envoyer la valeur de la cellule A1 dans un fichier texte ?
Sub a1txt()Var = [A1]FichierTXT = "C:\ajeter\aentxt.txt" 'à modifierIf Len(Dir(FichierTXT)) > 1 Then Kill FichierTXTOpen FichierTXT For Output As 1Print #1, VarCloseEnd Sub
Comment appliquer un pourcentage aux valeurs d'une plage?
Sub pourcentage()Dim mycell, myvaleur, pourcentpourcent = InputBox("Quel pourcentage appliquer?")If IsNumeric(pourcent) ThenFor Each mycell In Application.Selection.Cellsmyvaleur = mycell.Value
If IsNumeric(myvaleur) Then'teste si la cellule n'est pas vide ou contient une formuleIf Not (IsEmpty(myvaleur) Or mycell.HasFormula) Thenmycell.Value = myvaleur * (pourcent / 100 + 1)End IfEnd IfNext mycellEnd IfEnd Sub
Comment rendre impossible le défilement en dehors d'une zone définie ?
Sub Nodefil()Feuil1.ScrollArea = "B4:H23"End Sub
Sub Okdefil() ' pour libérer le défilementFeuil1.ScrollArea = "" End Sub
Compte les cellules vides d'une sélection
Sub CompteLesVides() Vide = 0For Each Cellule In Selection.CellsIf IsEmpty(Cellule) Then Vide = Vide + 1NextMsgBox "Il y a " & Vide & " cellules vides dans la sélection"End Sub
Et comment compter les non vides ? Il suffit d’ajouter l’opérateur Not de négation devant IsEmpty.
Sub CompteLesNonVides()NonVide = 0For Each Cellule In Selection.CellsIf Not IsEmpty(Cellule) Then NonVide = NonVide + 1NextMsgBox "Il y a " & NonVide & " cellules non vides dans la sélection"End Sub
Les Divers
Lance l'Explorateur sous Windows 95-98
Sub LanceProgramme()ValRetour = Shell("C:\WINDOWS\EXPLORER.EXE", 1)Application.Wait Now + TimeValue("00:00:04")SendKeys "%{F4}", True ' Envoie Alt+F4 pour fermer l'application EXPLORER.End Sub
Ouvre Word et le fichier test.doc
Sub OuvreWord() MyAppID = Shell("Winword.EXE C:\ajeter\test.doc", 1)AppActivate MyAppIDEnd Sub
'Fonctionne lorqu'il y a un espace dans le nom du repertoire avec ajout de ""
MyAppID = Shell("Winword.EXE ""C:\Mes documents\test.doc""", 1)
Ouvre un fichier TXT (test.txt)
Sub OuvreTXT()Workbooks.OpenText Filename:="C:\ajeter\TEST.TXT", _Origin:=xlWindows, StartRow:=1, _DataType:=xlDelimited, _TextQualifier:=xlDoubleQuote, _ConsecutiveDelimiter:=False, Tab:=False, _Semicolon:=True, Comma:=False, Space:=False, _Other:=False, FieldInfo:=Array(Array(1, 1), _Array(2, 1), Array(3, 1))End Sub
Pour exécuter une macro d'un autre classeur ouvert
Sub Essai()Run ("SiAlors.xls!Module2.ExMessage")End Sub
Pour exécuter une MacroXL4
Sub AppelDeMacroXL4()Application.Run Macro:=Range("nomDuFichier.XLS!NomDeLaMacro")End Sub
Teste la version d'Excel en cours
Sub testVersion()Dim myvers As Stringmyvers = Application.VersionMsgBox ("Microsoft Excel" & " " & myvers)End Sub
Quelle est la résolution d'écran ?
Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, _ByVal nIndex As Long) As LongDeclare Function GetDC Lib "user32" (ByVal hWnd As Long) As LongDeclare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, _ByVal hdc As Long) As Long
Sub RésolutionEcran()Dim Pix As LongPix = GetDC(0)MsgBox "La résolution est : " & GetDeviceCaps(Pix, 8) _& " * " & GetDeviceCaps(Pix, 10) & " pixels"ReleaseDC 0, PixEnd Sub
Inscrit la liste de tous les noms dans le classeur (Macros y compris)
Sub nom()Selection.ListNamesEnd Sub
Supprime tous les noms dans le classeur
Sub Supnom()Dim n As NameFor Each n In Namesn.DeleteNext nEnd Sub
Exporte un graphique au format JPG
Sub GraphJPG()Dim MyChart As ChartSet MyChart = ActiveSheet.ChartObjects(1).ChartMyChart.Export FileName:="C:\ajeter\graph1.jpg", filtername:="JPG"End Sub
Comment exécuter une macro Auto-Open en ouvrant un classeur par macro ?
Lorque l'on ouvre un fichier par macro les macros Auto_Open ne s'exécutent pas!!!En effet si l'on veut, par macro à la fois ouvrir un fichier et exécuter sa macro Auto_Openil faut utiliser une commande spéciale: "RunAutoMacros"
Sub OuvreLanceAutoOpen()Workbooks.Open "test.XLS"ActiveWorkbook.RunAutoMacros xlAutoOpenEnd Sub
Easter Eggs du Laboratoire des Technologies Microsoft
Un easter egg est un programme ou une fonction cachée dans vos logiciels préférés.Ceux-ci se déclenchent uniquement aprés une série d'actions bien précise.Ils ont été créés par les programmeurs, qui signent ainsi leur logiciel. MS
Un petit simulateur de vol dans Excel 97
1. Lancez Excel 97.2. Appuyez sur F5. 3. Dans la zone référence, mettez X97:L97, cliquez sur OK. 4. Appuyez sur la touche "Tabulation", normalement, on se retrouve en M97. 5. Gardez appuyées les touches "CTRL" et "SHIFT" puis cliquez sur l'icône assistant graphes(c'est une icône avec un graphique en barres).Le petit simulateur fonctionne avec la souris et les boutons gauche/droite pour marche avant/arrière.
Les développeurs d' Excel 2000
1. Tout d'abord, ouvrez Microsoft Excel. 2. Ensuite tapez F5 et écrivez X2000:L2000, puis appuyer sur entrée. 3. Appuyer sur la touche tabulation une seule fois. 4. Maintenez enfoncées les touches CTRL et SHIFT.5. Appuyez enfin sur l'icône de l'assistant graphique, il ressemble à un graphique en barres, en haut de l'écran.Notez que cet easter ne fonctionne que sous Excel 2000.
Un Jeu de Course en 3D caché dans Excel 2000
1. Démarrez Excel 2000.2. Dans le menu Fichier, faites 'Sauver en tant que page Web'. 3. Choisissez 'Publier' et 'Ajouter interactivité'.4. Sauvez votre page en .htm sur votre disque.5. Ouvrez le .htm avec votre IE. Vous avez à présent Excel au milieu de votre page. 6. Allez à la ligne 2000, sélectionnez toute la ligne. 7. Puis, à l'aide de la touche Tabulation, déplacez vous jusqu'à la colonne WC. 8. Utilisez les touches SHIFT+CTRL+ALT et cliquez sur le logo Office en haut à gauche.
9. Utilisez les flèches pour conduire, espace pour tirer, O pour lâcher de l'huile, et H pour les lumières.
Les Erreurs
Gestion simple de l'erreur
Sub Simple()On Error Resume Next Worksheets("Rapportw").Select
ne trouve pas la feuille "Rapportw" mais ne provoque pas d'erreur
End Sub
Exemple de traitement d'une erreur à l'ouverture d'une feuille
Sub Auto_Open()On Error GoTo Auto_Open_ErrWorksheets("Rapportw").Select
ne trouve pas la feuille "Rapportw" et affiche un message
Auto_Open_Err:Dim monMsgLet monMsg = "Une erreur " & Err & " s'est produite. "Let monMsg = monMsg & Error()MsgBox Prompt:=monMsgEnd Sub
Sort de la procédure s'il n'y a rien à coller
Sub ColleFormule()On Error GoTo Sort:Selection.PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= False, Transpose:=FalseExit SubSort:
Le traitement de l'erreur permet d'éviter un plantage si le presse-papier est vide.
End Sub
Evaluation d'une entrée
Sub EvalueValeur()On Error GoTo ValErreur
GetInput:MaValeur = InputBox("Tapez votre valeur (Entre 0 et 100)", "Valeur")If MaValeur = "" Then Exit Sub ' Sort si aucune valeur ou AnnulerIf MaValeur > 100 Then Error 5000 ' Erreur d'exécutionRange("A1").Value = MaValeurExit Sub
ValErreur:MsgBox "La valeur est incorrecte.Tapez une valeur comprise entre 0 et 100"Resume GetInputEnd Sub
Les Fichiers et Répertoires
Pour enregistrer le classeur actif avec comme nom le mois et l'année courant
Sub Saved()Dim M As String * 3
'ne prends en compte que les 3 premiers caractères
Dim An As StringM = Range("Mois")
'Définir le nom d'une plage sous Mois (idem An)
An = Right(Range("an"), 2)
'ne prends que les 2 derniers chiffres de l'an
ChDrive "c"ChDir "c:\corbeil"
'Changer le nom du répertoire s'il y a lieu!
ActiveWorkbook.SaveAs FileName:=(M) & (An)End Sub
Attention !supprime le fichier du disque dur
Sub SupprimFichier()Kill "C:\ajeter\money.txt"End Sub
Attention !supprime les fichiers du répertoire ainsi que le répertoire
Sub SupprimRépertoire()Kill "C:\aaa\*.*"
'si le répertoire n'est pas vide supprime tous les fichiers
RmDir "c:\aaa"
' Supprime le répertoire aaa.
End Sub
Attention! Crée un répertoire c:\aaa
Sub CreRépertoire()MkDir "c:\aaa"End Sub
Recherche de fichiers dont les noms commencent par "Fac"
Sub ChercheFichier()Set fs = Application.FileSearchWith fs.LookIn = "D:\Epuiset" .FileName = "Fac*"If .Execute > 0 ThenMsgBox .FoundFiles.Count & " Fichier(s) ont été trouvés."For I = 1 To .FoundFiles.CountMsgBox .FoundFiles(I)Next IElseMsgBox "Aucun fichier n'a été trouvé."End IfEnd WithEnd Sub
Ferme le classeur actif sans l'enregistrer
Sub FichierFermer()ActiveWorkbook.Saved = True
ActiveWorkbook.CloseEnd Sub
Ou encore...
Sub FermeSansMessage()Application.DisplayAlerts = FalseActiveWorkbook.CloseEnd Sub
Ou encore... plus condensé
Sub FermeSansMessage()ActiveWorkBook.Close SaveChanges:=False End Sub
Récupere les noms de fichiers d'un répertoire dans un tableau.
Option ExplicitDim chemin As StringSub RecupNomFichier(ByVal Chemin As String, ByRef Tableau As Variant)Dim Fichier As StringDim Compteur As IntegerDim LigneCompteur As IntegerChemin = Application.InputBox(Prompt:="Quel répertoire voulez-vous imprimer?")Chemin = Chemin + "\*.*"'Range("B1") = CheminCompteur = 1Fichier = Dir(Chemin)Do While (Len(Fichier) > 0)ReDim Preserve Tableau(Compteur)Tableau(Compteur - 1) = FichierLigneCompteur = Compteur + 1ActiveSheet.Range("B" & LigneCompteur).Value = Tableau(Compteur - 1)Compteur = Compteur + 1Fichier = Dir()LoopEnd Sub
'...Affecter cette macro à un bouton
Sub RecupFichierTableau()Dim Tableau() As StringCall RecupNomFichier(Chemin, Tableau)End Sub
Recherche un fichier dans un répertoire.
Sub ChercheFichier()Set fs = Application.FileSearchWith fs.LookIn = "D:\Epuiset".FileName = "Fac*"If .Execute > 0 ThenMsgBox .FoundFiles.Count & " Fichier(s) ont été trouvés."For I = 1 To .FoundFiles.CountMsgBox .FoundFiles(I)Next IElseMsgBox "Aucun fichier n'a été trouvé."End IfEnd WithEnd Sub
Donne le nom de tous les fichiers ouverts.
Sub NbFich()Dim Wkb As WorkbookFor Each Wkb In WorkbooksMsgBox Wkb.NameNext WkbEnd Sub
Donne le chemin complet du fichier ouvert.
Sub CheminFichier()Range("b1").Value = ActiveWorkbook.FullNameEnd Sub
Ouvre un fichier texte nommé test.txt situé dans C:\ajeter
Sub OuvreTxt()Workbooks.OpenText Filename:="C:\ajeter\test.txt", _Origin:=xlWindows, StartRow:=1,DataType:=xlDelimited, _TextQualifier:=xlDoubleQuote,ConsecutiveDelimiter:=False, Tab:=False, _Semicolon:=True, Comma:=False, Space:=False,Other:=False, FieldInfo:=Array(Array(1, 1),Array(2, 1), Array(3, 1))End Sub
Cherche et ouvre tous les fichiers situés dans le répertoire C:\ajeter
Sub ChercheetOuvreFichier()Set fichcherche = Application.FileSearchWith fichcherche
' .LookIn = GetDirectory 'Utilise la fonction GetDirectory voir page Exemple d'application
.LookIn = "C:\ajeter" 'Changer le chemin
.FileName = "*.xls" 'ou "*.txt"If .Execute > 0 ThenMsgBox .FoundFiles.Count & " Fichier(s) a (ont) été trouvé(s)."For I = 1 To .FoundFiles.CountWorkbooks.Open FileName:=.FoundFiles(I)On Error Resume NextNext IElseMsgBox "Aucun fichier n'a été trouvé."End IfEnd WithEnd Sub
Lance la boîte de dialogue "Ouvrir"pour sélectionner un fichier et en conserver le nom dans une variable
Sub Nomdufichier()Dim NomFichierNomFichier = Application.GetOpenFilenameIf VarType(NomFichier) = vbBoolean Then MsgBox "Action annulée" _Else MsgBox "Fichier sélectionné : " & NomFichierEnd Sub
Ouvre le fichier Test.xls s'il n'est pas déjà ouvert
Sub OuvreSiPasOuvert()Dim Worbk As WorkbookOn Error Resume NextSet Worbk = Workbooks("Test.xls")On Error GoTo 0If Worbk Is Nothing Then Workbooks.Open "C:\ajeter\Test.xls" _Else Set Worbk = NothingEnd Sub
Copie le fichier Test.xls dans le répertoire Temp
Sub CopyFichier()Msg = "Etes-vous sûr de vouloir copier ce fichier?"Style = vbYesNo + vbCritical + vbDefaultButton1Title = "COPIE DU FICHIER TEST.XLS"Réponse = MsgBox(Msg, Style, Title, Help, Context)If Réponse = vbYes ThenGoTo continuElseExit SubEnd If
continu:FileCopy "D:\FichXL97\Test.xls", "c:\temp\Test.xls"End Sub
Déplace le fichier Test.xls dans le répertoire aaa
Sub deplace()Name "c:\Test.xls" As "c:\aaa\Test.xls"End Sub
Enregistre le classeur sous la valeur de la cellule C1 dans le répertoire c:\ajeter
Sub NomClasseur()Dim Chr As String 'déclare la variableChr = Range("Essai!C1")'Feuille Essai et cellule C1ChDrive "C" 'si C n'est pas le disque par défautChDir "C:\ajeter\"ActiveWorkbook.SaveAs Filename:=(Chr)End Sub
Enregistre le classeur avec le mois (cellule C1) et l'année(cellule C2)
Sub NomClasseur1()Dim Month As String * 3 'seulement les 3 premières lettresDim Year As StringMonth = Range("Feuil1!C1")Year = Right(Range("Feuil1!C2"), 2) 'pour ne renvoyer que 01 de 2001ChDrive "C" ChDir "C:\ajeter\"ActiveWorkbook.SaveAs Filename:=(Month) & (Year)End Sub
Inscrire automatiquement la date de modification du classeur à sa fermeture
En utilisant l’événement BeforeClose la macro suivante inscrit automatiquementla date de la dernière modification dans la cellule A1 de la première feuille de votre classeur.
Private Sub Workbook_BeforeClose(Cancel As Boolean)Sheets(1).[A1] = "Dernière modification le " & Format(Date, "dd/mm/yyyy")End Sub
Demande sous quel nom enregistrer le classeur
Sub Enregistre_Sous()Réponse = MsgBox("Voulez-vous enregistrer ce classeur ?", vbYesNo)If Réponse = vbYes ThenNom = InputBox("Donnez un nom de fichier !" & Chr(13) & "Exemple: Rapport")If Nom = "" ThenExit SubElseGoTo continuEnd Ifcontinu:ChDrive "c"ChDir "c:\ajeter" 'Indiquez le répertoireActiveWorkbook.SaveAs FileName:=(Nom)
'Application.Dialogs(xlDialogSaveAs).Show'pour afficher la boîte Enregistrer sous
End IfEnd Sub
Autre méthode en testant l'entrée du nom
Sub Enregistre_Sous2()Réponse = MsgBox("Voulez-vous enregistrer ce classeur ?", vbYesNo)If Réponse = vbYes Then
Dim nom As StringDo While nom = ""
'Répète l'instruction tant qu'aucun nom est donné
nom = InputBox("Donnez un nom de fichier !" & Chr(13) & "Exemple: Rapport")Loop
ChDrive "c"ChDir "c:\ajeter" 'Indiquez le répertoireActiveWorkbook.SaveAs FileName:=(nom)'Application.Dialogs(xlDialogSaveAs).Show'pour afficher la boîte Enregistrer sousEnd IfEnd Sub
Enregistre la feuille active en nouveau classeur
Sub Enregistre_1_Feuille()ActiveSheet.CopyApplication.Dialogs(xlDialogSaveAs).Show'Active la boite de dialogue Enregistrer sous
End Sub
Pour plusieurs feuilles:Sheets(Array("Feuil1", "Feuil2")).Copy
Copie tous les fichiers du répertoire "AA" dans le répertoire "BB".
Il faut activer la référence "Microsoft Scripting Runtine"Outils => Références...
Sub CopiRepert()Dim FSO As New FileSystemObjectFSO.CopyFolder "C:\AA", "C:\BB"End Sub
Quel est le dernier document que j'ai modifié hier ?
Changez le répertoire dans cette ligne:.LookIn = "C:\mes fichiers"
Sub LastModif()With Application.FileSearch.NewSearch.LookIn = "C:\mes fichiers".SearchSubFolders = True.LastModified = msoLastModifiedYesterday.MatchAllWordForms = True.FileType = msoFileTypeAllFiles
If .Execute() > 0 ThenMsgBox "Ce dossier contient " & .FoundFiles.Count & " fichier(s) modifié(s)."
For i = 1 To .FoundFiles.CountMsgBox .FoundFiles(i)Next i
ElseMsgBox "Aucun fichier modifié."End IfEnd WithEnd Sub
Quel est la taille du fichier ?
Renvoie la taille du fichier en octets
Sub Taillefile()Dim SizeFileSizeFile = FileLen("c:\ajeter\classeur1.xls")
MsgBox "Taille du fichier " & SizeFile & " octets"
'du classeur actifMsgBox FileLen(ThisWorkbook.FullName) & " octets"End Sub
Comment récupérer le chemin complet d'un répertoire et l'enregistrer dans un fichier texte?
Ce qui évite d'avoir à taper tout le chemin à la main !surtout lorsqu'il s'agit de récuperer le chemin des dossiers d'Outlook Express
Public Type BROWSEINFOhOwner As LongpidlRoot As LongpszDisplayName As StringlpszTitle As StringulFlags As Longlpfn As LonglParam As LongiImage As LongEnd Type
'32-bit API declarations
Declare Function SHGetPathFromIDList Lib "shell32.dll" _Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As LongDeclare Function SHBrowseForFolder Lib "shell32.dll" _Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Function GetDirectory(Optional Msg) As StringDim bInfo As BROWSEINFODim path As StringDim r As Long, x As Long, pos As IntegerbInfo.pidlRoot = 0&If IsMissing(Msg) ThenbInfo.lpszTitle = "Select a folder."ElsebInfo.lpszTitle = MsgEnd IfbInfo.ulFlags = &H1x = SHBrowseForFolder(bInfo)path = Space$(512)r = SHGetPathFromIDList(ByVal x, ByVal path)If r Thenpos = InStr(path, Chr$(0))GetDirectory = Left(path, pos - 1)Range("A1") = GetDirectoryElseGetDirectory = ""End IfEnd Function
Sub appel()Range("A1").ClearContentsMsg = "Selection de la directory désirée"ChDir GetDirectory(Msg)Var = [A1]FichierTXT = "C:\ajeter\path.txt" 'à modifierIf Len(Dir(FichierTXT)) > 1 Then Kill FichierTXTOpen FichierTXT For Output As 1Print #1, VarCloseEnd Sub
Comment avoir la liste et les valeurs des propriétes du fichier ?
Sub lstProprieteFichier()lg = 1Worksheets.AddFor Each LstPro In ActiveWorkbook.BuiltinDocumentPropertiesCells(lg, 1).Value = LstPro.NameOn Error Resume NextCells(lg, 2).Value = ActiveWorkbook.BuiltinDocumentProperties.Item(LstPro.Name)lg = lg + 1NextColumns("A:A").EntireColumn.AutoFitRange("B10:B12").NumberFormat = "[$-F800]dddd, mmmm dd, yyyy"End Sub
Comment créer un dossier ?
Ajouter une référence à "Microsoft Scripting Runtime"depuis le menu Projet à Références de l'Editeur Visual Basic.
Sub CreationDossier()Dim fso ' As Scripting.FileSystemObjectDim fd ' As Scripting.FolderDim sFolderName ' As String
' Initialisation du nom du dossiersFolderName = "C:\NewDossier"
Set fso = CreateObject("Scripting.FileSystemObject")
' Vérifier que le dossier à créer n'existe pasIf Not fso.FolderExists(sFolderName) Then' Créer le dossier.Set fd = fso.CreateFolder(sFolderName)MsgBox "Le dossier " & sFolderName & " a été créé"ElseMsgBox "Le dossier " & sFolderName & " existe déjà!"
End IfEnd Sub
Comment supprimer ce dossier ?
Sub SuppressioDossier()Dim fso ' As Scripting.FileSystemObjectDim fd ' As Scripting.FolderDim sFolderName ' As String
' Initialisation du nom du dossiersFolderName = "C:\NewDossier"
Set fso = CreateObject("Scripting.FileSystemObject")' Vérifier que le dossier à supprimer existe bienIf fso.FolderExists(sFolderName) ThenSet fd = fso.GetFolder(sFolderName)fd.DeleteMsgBox "Le dossier " & sFolderName & " a été supprimé"ElseMsgBox "Le dossier " & sFolderName & " n'existe pas"End IfEnd Sub
Comment renommer ce dossier ?
Sub RenommerDossier()Dim fso ' As Scripting.FileSystemObjectDim fd ' As Scripting.FolderDim s ' As StringDim sFolderName ' As StringDim sNewName ' As StringDim sTemp ' As String
' Initialisation des noms de dossierssFolderName = "C:\NewDossier"sNewName = "LeDossier"
Set fso = CreateObject("Scripting.FileSystemObject")' Vérifier que le dossier source existe bien.If fso.FolderExists(sFolderName) Then' Récupérer l'instance du dossier.Set fd = fso.GetFolder(sFolderName)sTemp = fd.Drive & "\" & sNewName' Vérifier que le dossier cible n'existe pas déjà.If fso.FolderExists(sTemp) ThenMsgBox "Ce nom de dossier existe déjà!"Elsefd.Name = sNewNameMsgBox "Le dossier " & sFolderName & " a été renommé!"End If
ElseMsgBox "Dossier non trouvé!"End IfEnd Sub
Comment rechercher les fichiers XLB et en avoir la liste?
Valable pour toutes sortes de fichiers aussi !
Sub ChercheXLB()typeFile = InputBox("Quel type de fichier? " & Chr(13) & "Taper l'extension ! Ex: xlB")Worksheets.AddActiveSheet.Name = "Liste des fichiers" & " " & typeFile[A1].Value = "Liste des fichiers" & " " & typeFileSelection.Font.Bold = True
Dim LstFile As LongWith Application.FileSearch.Filename = "*." & typeFile.LookIn = "C:\".SearchSubFolders = TrueFor LstFile = 1 To .Execute(msoSortByFileName)ActiveSheet.Cells(LstFile + 1, 1).Value = .FoundFiles(LstFile)Next LstFileEnd WithEnd Sub
Comment ouvrir un fichier TXT,CSV, HTM ... avec le bloc-note (Notepad) ?
Sub OuvreTXT()lanceur = Shell ("C:\windows\notepad.exe c:\ajeter\lefichier.txt", 1)End Sub
'OPTION de FENETRE'vbHide - 0 - La fenêtre est masquée et activée.'vbNormalFocus - 1 - La fenêtre est rétablie à sa taille et à sa position d'origine.'vbMinimizedFocus - 2 - La fenêtre est affichée sous forme d'icône et activée.'vbMaximizedFocus - 3 - La fenêtre est agrandie et activée.'vbNormalNoFocus - 4 - La fenêtre est rétablie à sa taille et à sa position les plus récentes'vbMinimizedNoFocus - 6 - La fenêtre est affichée sous forme d'icône.
Ce fichier existe-t'il ?
Sub Existe()If Dir$("c:\ajeter\test.xls") = "" ThenMsgBox " Pas trouvé ce fichier :O("ElseMsgBox " OK ! Trouvé :O)"
End IfEnd Sub
Les Feuilles
Nomme la feuille active avec la valeur de la plage A2
Sub NomOnglet()Dim Name As StringName = Range("A2")Application.ScreenUpdating = FalseActiveSheet.Name = (Name)End Sub
Pour toutes les feuilles
For i = 1 To Sheets.CountWith Sheets(i).Select.Name = [A2]End WithNext i
Trie les onglets des feuilles d'un fichier excel par ordre alphabétique. Première!
Type performant de procédure ;O) à Laurent...
Sub TrieFeuilles()Dim I As IntegerDim J As IntegerDim Min As IntegerDim ModeCalcul As IntegerModeCalcul = Application.CalculationApplication.Calculation = xlCalculationManualApplication.ScreenUpdating = FalseWith ActiveWorkbook.WorksheetsFor I = 1 To .Count - 1Min = IFor J = I + 1 To .CountIf .Item(J).Name < .Item(Min).Name Then Min = JNext JIf Min <> I Then .Item(Min).Move before:=Worksheets(I)Next IEnd WithApplication.Calculation = ModeCalculApplication.ScreenUpdating = TrueEnd Sub
Trie les onglets des feuilles d'un fichier excel par ordre alphabétique. Deuxième!
Sub TriChaqueFeuilles()Dim X As VariantDim I As VariantFor Each X In ActiveWorkbook.SheetsFor I = 2 To ActiveWorkbook.Sheets.CountIf Sheets(I - 1).Name > Sheets(I).Name ThenSheets(I - 1).Move After:=Sheets(I)End IfNextNextEnd Sub
Masque les onglets du classeur
Sub MasqueOnglet()With ActiveWindow.DisplayWorkbookTabs = Not .DisplayWorkbookTabsEnd WithEnd Sub
Affiche les onglets du classeur
Sub AfficheOnglet()ActiveWindow.DisplayWorkbookTabs = TrueEnd Sub
2 macros, l'une masque les colonnes et lignes l'autre les affiche.
Sub MasqueColonneLigne()On Error Resume NextApplication.ScreenUpdating = FalseNumligne = InputBox(Prompt:="Taper les numéros de lignes. ( Ex. 8:12 - Maxi = 65536)")NumColonne = InputBox(Prompt:="Taper les numéros de colonnes. ( Ex. J:D - Maxi = IV )")Rows(Numligne).SelectSelection.EntireRow.Hidden = TrueColumns(NumColonne).SelectSelection.EntireColumn.Hidden = TrueEnd Sub
Sub AfficheLigneColonne()[A:IV].SelectSelection.EntireRow.Hidden = FalseSelection.EntireColumn.Hidden = FalseCells(1, 1).SelectEnd Sub
2 macros, l'une masque les en-têtes de ligne et colonne l'autre les affiche
Sub MsqEntetLigCol()'masque les en-têtes de ligne et colonneActiveWindow.DisplayHeadings = FalseEnd Sub
Sub EntetLigCol()'affiche les en-têtes de ligne et colonneActiveWindow.DisplayHeadings = TrueEnd Sub
Insere le chemin d'accés dans le pied de page.
Sub CustomFooter()'Inserts the file name and path into the page footer'for each sheet in the active workbookFor Each sht In ActiveWorkbook.Sheetssht.PageSetup.LeftFooter = ActiveWorkbook.FullNameNext shtEnd Sub
Donne le nom de chaque feuille du classeur.
Sub FeuilleMSG()Dim Lst() As StringDim I As IntegerReDim Lst(Sheets.Count - 1)For I = 0 To Sheets.Count - 1Lst(I) = Sheets(I + 1).NameMsgBox Lst(I)Next IEnd Sub
Insére 12 feuilles et les nomme suivant les 12 mois de l'année.
Sub NomFeuilMois()For I = 1 To 12ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count)ActiveSheet.Name = Format(30 * I, "mmmm")Next IEnd Sub
Supprime les feuilles vides du classeur
Sub DelFeuilleVide()Set LaCell = ActiveCellSet MaFeuille = ActiveWorkbook.ActiveSheetOn Error Resume NextFor Each x In ActiveWorkbook.Worksheetsx.ActivateSelection.SpecialCells(xlLastCell).SelectLeTestFeuil = FalseFor Each y In ActiveSheet.DrawingObjectsLeTestFeuil = TrueExit ForNextIf ActiveCell.Address = "$A$1" And IsEmpty(ActiveCell) And LeTestFeuil = False ThenApplication.DisplayAlerts = Falsex.DeleteApplication.DisplayAlerts = TrueEnd IfNext xMaFeuille.ActivateLaCell.SelectEnd Sub
Insère une feuille nommée Liste des feuilles et crée le sommaire du classeur.
Sub ListeFeuilles()Application.ScreenUpdating = FalseApplication.DisplayAlerts = FalseSet ArrFeuil = Sheets("Liste des feuilles")ArrFeuil.Cells(1, 1).Value = "Tableau des feuilles"For i = 2 To ActiveWorkbook.Sheets.CountArrFeuil.Cells(i, 1).Value = Sheets(i).NameNext iApplication.DisplayAlerts = TrueAlerte = TrueApplication.ScreenUpdating = TrueEnd Sub
Insère une feuille et liste les feuilles sour forme de liens hypertextes.
Sub LstSheetHyperlink()Set newfeuille = ActiveWorkbook.Sheets.Add(Type:=xlWorksheet)For i = 1 To Sheets.Countnewfeuille.Cells(i, 1).Value = Sheets(i).NameWith Worksheets(newfeuille.Name)ActiveSheet.Hyperlinks.Add Anchor:=.Cells(i, 1), Address:="", SubAddress:= _Chr(39) & Sheets(i).Name & Chr(39) & "!A1" End With
Next iEnd Sub
Change le nom de la feuille active avec le texte du Presse Papier
Sub NomFeuilClipboard()Dim FeuilObj As New DataObjectFeuilObj.GetFromClipboardActiveSheet.Name = FeuilObj.GetText(1)End Sub
Insère des feuilles et les nomme suivant une liste
Créez une liste de noms et sélectionnez la avant de lancer la macro
Sub FeuilViaLst() Dim Mycell As Range, Mysheet As Worksheet, MyName$For Each Mycell In Selection 'liste de nomsMyName = Mycell.ValueIf MyName <> "" ThenOn Error Resume NextSet Mysheet = Sheets(MyName)On Error GoTo 0If Mysheet Is Nothing Then Sheets.Add.Name = MyNameEnd IfNext MycellEnd Sub
et pour les supprimer
Sub DelFeuilViaLst()Dim Mycell As Range, Mysheet As Worksheet, MyName$Application.DisplayAlerts = FalseFor Each Mycell In Selection 'liste de nomsMyName = Mycell.ValueIf MyName <> "" ThenOn Error Resume NextSet Mysheet = Sheets(MyName)On Error GoTo 0If Not Mysheet Is Nothing Then Sheets(MyName).DeleteEnd IfNext MycellEnd Sub
Tout changement du contenu d'une cellule A1 dans une feuille du classeurmodifiera automatiquement le nom de la feuille.
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)If Target.Address = "$A$1" Then Sh.Name = TargetEnd Sub
Pour revenir à la feuille "Sommaire" lors d'un click sur l'onglet.
Programmer un événement Worksheet_Activate sur la feuille en question
Private Sub Worksheet_Activate()ThisWorkbook.Worksheets("Sommaire").ActivateEnd Sub
Protége toutes les feuilles du classeur.
Sub ProtectFeuil()Dim sht As WorksheetDim MotPassMotPass = InputBox("Taper un mot de passe", 2)
For Each sht In ActiveWorkbook.Worksheetssht.Protect Password:=(MotPass), Contents:=True, _DrawingObjects:=True, Scenarios:=TrueNext shtEnd Sub
Sub UnProtectFeuil()Dim sht As WorksheetFor Each sht In ActiveWorkbook.Worksheetssht.UnprotectNext shtEnd Sub
Ajout spécial XP: AllowFormattingCells:=True, AllowSorting:=True
Sub ProtectFeuilXP()Dim sht As WorksheetDim MotPassMotPass = InputBox("Taper un mot de passe", 2)
For Each sht In ActiveWorkbook.Worksheetssht.Protect Password:=(MotPass), Contents:=True, _DrawingObjects:=True, Scenarios:=True, _AllowFormattingCells:=True, AllowSorting:=TrueNext shtEnd Sub
Quel est le type d'objet sélectionné ?
Sélectionner un objet sur la feuille "Feuil1"
Sub TypeObjet()Worksheets("Feuil1").ActivateMsgBox "Type d'objet sélectionné " & TypeName(Selection)End Sub
Compte le nombre de page
Sub LstNbsautPage()'Sans saut de page verticalMsgBox ActiveSheet.HPageBreaks.Count + 1'+1 pour avoir le nb de pagesEnd Sub
'Ajoute un saut de page horizontal au-dessus de la cellule active.ActiveSheet.HPageBreaks.Add Before:=ActiveCell
'Ajoute un saut de page vertical à gauche de la cellule active.ActiveSheet.VPageBreaks.Add Before:=ActiveCell
Cherche une feuille et l'active
Sub cherche()Dim maFeuil As StringOn Error GoTo GestErreurmaFeuil = InputBox(Prompt:="Taper le nom de la feuille recherchée. ")Sheets(maFeuil).SelectRange("a1").SelectExit SubGestErreur:MsgBox "Cette feuille n'existe pas !"End Sub
Chaque jour de l'année = une feuille (soit 365 feuilles)
Sub Calendjourfeuille()Application.ScreenUpdating = Falseannée = Val(InputBox("Quelle année ?"))If année = 0 Then Exit Subx = DateSerial(année, 1, 1)Y = DateValue("31 décembre " & année)For I = 0 To Y - xActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count)ActiveSheet.Name = Format(x + I, "dd-mmm-yyyy")NextEnd Sub
Chaque jour du mois = une feuille
Sub CalendParJourduMois()Application.ScreenUpdating = False
'Date de début du mois en coursvardate = DateSerial(Year(Now), Month(Now), 1)
'nombre de jour du mois en coursvarnb = Day(DateSerial(Year(Now), Month(Now) + 1, 0)) - 1
For I = 0 To varnbActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count)ActiveSheet.[A1] = vardate + IActiveSheet.Name = Format([A1], "dddd dd mmmm yy")Next IEnd Sub
En A1 le nom de la feuille
Sub A1nomfeuil()Application.ScreenUpdating = FalseFor Each x In ActiveWorkbook.Sheetsx.Activate[A1] = ActiveSheet.NameNextEnd Sub
Supprime toutes les feuilles sauf la feuille "Liste"
Sub SupFeuille()Application.DisplayAlerts = FalseFor I = Sheets.Count To 1 Step -1If Sheets(I).Name = "Liste" ThenElseSheets(I).DeleteEnd IfNextEnd Sub
ou bien
Sub SupFeuille2()Application.DisplayAlerts = FalseDim W As WorksheetFor Each W In ActiveWorkbook.WorksheetsIf W.Name = "liste" ThenElse: W.DeleteEnd If
Next WEnd Sub
Calcule la somme des cellules D2 de toutes les feuilles
Sub CalculSum()Application.ScreenUpdating = FalseFor Each feuille In ActiveWorkbook.Sheetsfeuille.Activatetot = [D2]result = result + totNext MsgBox resultEnd Sub
Masque les lignes vides de la feuille et imprime la zone en cours
Sub imprSansLigneVide()For Each Ligne In ActiveSheet.UsedRange.RowsIf Ligne.Cells(1, 1).Value = Empty Then'si la cellule de la colonne A est vide, la ligne est masquéeLigne.EntireRow.Hidden = TrueEnd IfNext'Recherche de la derniere celluleActiveCell.SpecialCells(xlLastCell).Selectdercell = ActiveCell.Address
'definition de la zone d'impressionzoneIMP = Range("A1", dercell).Address
ActiveSheet.PageSetup.PrintArea = zoneIMPActiveWindow.SelectedSheets.PrintOut Copies:=1End Sub
Liste les feuilles dans la colonne A
Sub lstFeuille()x = 0Worksheets(1).ActivateFor Each s In ActiveWorkbook.Sheetsx = x + 1Cells(x, 1) = s.NameNextEnd Sub
Les Impressions
Imprime chaque fiche (fiche =plage G1:K18) des feuilles(5 à 42) du classeur
Sub ImprimFiche()Msg = "Voulez-vous vraiment imprimer TOUTES les fiches ?"Style = vbYesNo + vbCritical + vbDefaultButton1Title = "IMPRESSION DES FICHES"Réponse = MsgBox(Msg, Style, Title)If Réponse = vbYes ThenGoTo continuElseExit SubEnd Ifcontinu:Dim mafeuille As ObjectApplication.ScreenUpdating = FalseSet monTab = Worksheets(Array(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, _23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42))For Each mafeuille In monTabmafeuille.SelectActiveSheet.PageSetup.PrintArea = "$G$1:$K$18"ActiveWindow.SelectedSheets.PrintOut Copies:=1NextEnd Sub
Imprime un nombre définit de formulaires et incrémente le numéro du formulaire.
Sub ImprimFormulaire()Dim CellParaRange("A2") = Application.InputBox(prompt:="Taper le nombre de copies que vous désirez.", Type:=1)For CellPara = 1 To Range("A2")Range("E13").Value = Range("E13").Value + 1ActiveSheet.PageSetup.PrintArea = "$A$5:$I$24"ActiveWindow.SelectedSheets.PrintOut Copies:=1NextEnd Sub
Lance une impression à l'heure donnée.
Sub ProgrammeLaMacroTime()' lance MacroImpression à 10h25 heuresApplication.OnTime TimeValue("10:25:00"), "MacroImpression", , TrueEnd Sub
Sub MacroImpression()'cette macro imprime la feuille Feuil1ThisWorkbook.Sheets("Feuil1").PrintOutEnd Sub
Défini une zone d'impression et un titre.
Inscriver un titre dans la cellule A1et taper quelques valeurs dans la zone A10:G15
Sub ImpZoneEtTitle()With Worksheets("Feuil1").PageSetup.CenterHorizontally = True.PrintArea = "$A$10:$G$15".PrintTitleRows = ("$A$1:$A$2").Orientation = xlPortrait.FitToPagesWide = 1.FitToPagesTall = 1End WithWorksheets("Feuil1").PrintOutEnd Sub
Comment récupérer l'adresse de la zone d'impression?
Sub Recupzone()Set zoneIMP = Range(ActiveSheet.PageSetup.PrintArea)MsgBox zoneIMP.Address()End Sub
Comment interdire l'impression d'un classeur?
Private Sub Workbook_BeforePrint(Cancel As Boolean)Cancel = TrueMsgBox ("Vous n'avez pas l'autorisation d'imprimer ce classeur")End Sub
Comment connaître le nombre de pages à imprimer?
Sub Nbpages()NbdePages = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)")End Sub
Ouvre un fichier et l'imprime automatiquement
Private Declare Function ShellExecute Lib "shell32.dll" Alias _"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal _
lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As _String, ByVal nShowCmd As Long) As Long
Private Const SW_SHOWNORMAL As Long = 1
Sub Imprim()Dim oFile As StringApplication.ScreenUpdating = False'imprime le fichier test.txtoFile = "C:\ajeter\test.txt"ShellExecute hwnd, "print", oFile, vbNullString, vbNullString, SW_SHOWNORMALEnd Sub
Les Médias
Joue un son Wav
Declare Function sndPlaySound32 Lib "winmm.dll" Alias "sndPlaySoundA" _(ByVal lpzSoundName As String, ByVal uFlags As Long) As Long
Sub Musique()If Application.CanPlaySounds ThenCall sndPlaySound32("D:\Sons\Vinyl\creedenc.wav", 0)
Changer le chemin...("D:\.....", 0)
End IfEnd Sub
Ouvre et ferme le lecteur de CD
Declare Sub mciSendStringA Lib "winmm.dll" (ByVal lpstrCommand As String, _ByVal lpstrReturnString As Any, ByVal uReturnLength As Long, _ByVal hwndCallback As Long)
Sub Ouvre()mciSendStringA "Set CDAudio Door Open", 0&, 0, 0End Sub
Sub Ferme()mciSendStringA "Set CDAudio Door Closed", 0&, 0, 0End Sub
Teste s'il existe un lecteur de CD
Private Declare Function GetDriveTypeA Lib "Kernel32" _(ByVal nDrive As String) As Long
Sub TestCD()Dim I As IntegerFor I = 65 To 91If GetDriveTypeA(Chr$(I) & ":\") = 5 Then Exit ForNext IIf I = 92 Then MsgBox "Aucun lecteur de CD-ROM détecté." _Else MsgBox "Lecteur détecté sur " & Chr$(I) & ":"End Sub
Sub ShowStars()Cells.SelectSelection.Interior.ColorIndex = 1Range("A1").SelectRandomizeStarWidth = 35StarHeight = 35For i = 1 To 10TopPos = Rnd() * (ActiveWindow.UsableHeight - StarHeight)LeftPos = Rnd() * (ActiveWindow.UsableWidth - StarWidth)Set NewStar = ActiveSheet.Shapes.AddShape _(msoShape4pointStar, LeftPos, TopPos, StarWidth, StarHeight)NewStar.Fill.ForeColor.SchemeColor = Int(Rnd() * 56)Application.Wait Now + TimeValue("00:00:01")DoEventsNext iApplication.Wait Now + TimeValue("00:00:02")Set myShapes = Worksheets(1).ShapesFor Each shp In myShapesIf Left(shp.Name, 9) = "AutoShape" Thenshp.DeleteApplication.Wait Now + TimeValue("00:00:01")End IfNextCells.SelectSelection.Interior.ColorIndex = 2Range("A1").SelectEnd Sub
Joue un son MP3.
Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _ByValuReturnLength As Long, ByVal hwndCallback As Long) As Long
Public Declare Function GetShortPathName Lib "kernel32" Alias _"GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As _String, ByVal cchBuffer As Long) As Long
Sub LanceMP3()X = ThisWorkbook.PathjoueMP3 (X & "\monfichier.mp3")End Sub
Public Sub joueMP3(ByVal Mp3 As String) Dim Tmp As Long, Tmp2 As String'Screen.MousePointer = vbHourglass
Tmp2 = NomCourt(Mp3)Tmp = mciSendString("close MP3_Device", vbNullString, 0&, 0&)Tmp = mciSendString("open " & Tmp2 & " type MPEGVideo alias MP3_Device", _vbNullString, 0&, 0&)If Tmp = 0 ThenTmp = mciSendString("play Mp3_Device", vbNullString, 0&, 0&)
If Tmp <> 0 ThenScreen.MousePointer = 0MsgBox "Incapable de jouer ce Mp3"'Else' Tmp = mciSendString("close MP3_Device", vbNullString, 0&, 0&)End IfElse'Screen.MousePointer = 0MsgBox "Incapable de jouer ce Mp3"End If
'Screen.MousePointer = 0End Sub
Public Sub StopMP3()Dim Tmp As LongTmp = mciSendString("close MP3_Device", vbNullString, 0&, 0&)End Sub
Private Function NomCourt(ByVal Fichier As String) As StringDim Tmp As String * 255, Tmp2 As ByteTmp2 = GetShortPathName(Fichier, Tmp, Len(Tmp))
If Tmp2 > 0 ThenNomCourt = Left(Tmp, Tmp2)End IfEnd Function
Sélectionne un fichier image et l'insère dans la feuille active
Sub insertImg()Dim fichImgfichImg = Application.GetOpenFilename("Fichier image(*.gif;*.jpg;*.bmp),*.gif;*.jpg;*.bmp" _, , "Choix de l'image", , False) 'false selection simpleIf fichImg = False Then Exit SubActiveSheet.Pictures.Insert(fichImg).SelectEnd Sub
Un trombinoscope via les commentaires
Dans les cellules A1:A10 entrez une liste de noms correspondant à des portraits (par ex.) Cette liste de noms doit correspondre à une liste de fichiers "JPG" situés dans le même dossier que votre classeur.Sélectionnez la zone A1:A10 et executez la macro "imgComment".Au passage de la souris sur ces cellules les portraits s'afficheront dans les commentaires de cellules
Sub imgComment()Dim nom$On Error Resume NextFor Each C In Selectionnom = C.ValueWith C.AddComment.Comment.Shape.Fill.UserPicture ActiveWorkbook.Path & "\" & nom & ".jpg"End WithNextEnd Sub
Insère une image dans une cellule
Une image est insérée en C10Le nom de l'image est recuperée dans la cellule B10(nom = Selection.Offset(0, -1).Value) ex : photo1 sans l'extension.(fichimg = ActiveWorkbook.Path & "\" & nom & ".jpg")
L'image est dans le même dossier que le classeur (ActiveWorkbook.Path)
La largeur de l'image correspondra à la largeur de la cellule C10.(With ActiveWindow , y = .Selection.Width , End With)(Selection.ShapeRange.Width = y)
Sub InserImage()Dim nom$Dim fichimg$
[C10].Select
With ActiveWindowy = .Selection.WidthEnd With
On Error Resume Nextnom = Selection.Offset(0, -1).Valuefichimg = ActiveWorkbook.Path & "\" & nom & ".jpg"ActiveSheet.Pictures.Insert(fichimg).SelectSelection.ShapeRange.Width = yEnd Sub
Les Messages
Affiche un message avec un bouton OUI et un bouton NON
Sub Message()msg = "Voulez-vous continuer ?"
' Définit le message.
Style = vbYesNo + vbDefaultButton1
'Définit les boutons.
Title = "Bonjour !"
' Définit les titres.
Réponse = MsgBox(msg, Style, Title)If Réponse = vbYes Then
' Vous avez choisi le bouton « Oui ».
Set MaSélection = Application.ActiveCellMaSélection.Value = 100Else
'Vous avez choisi le bouton Non.
Range("A1:b2").Select ' Accomplit une autre chose.End IfEnd Sub
Inscrit un message dans la barre d'état pendant l'exécution d'une macro
Sub MsgBarreEtat()barreEtatEnregistrée = Application.DisplayStatusBarApplication.DisplayStatusBar = TrueApplication.StatusBar = "Création du tarif catalogue.....Veuillez patienter, SVP....."
'....exécution d'une macro (généralement long).....
Application.Wait Now + TimeValue("00:00:04")Application.StatusBar = FalseApplication.DisplayStatusBar = barreEtatEnregistréeEnd Sub
Donne l'heure
Sub MsgHeure()mheure = TimeMsgBox ("Il est: " & mheure)End Sub
Quelques trucs sur les boutons des messages
'Indique un message d'information
Sub msg1()MsgBox "Test MSG1", vbInformation, "Information fichier"End Sub
'Idem avec la valeur 64
Sub msg11()MsgBox "Test MSG11", 64, "Information fichier"End Sub
'Indique un message d'exclamation
Sub msg2()MsgBox "Test MSG2", vbExclamation, "Information fichier"End Sub
'Idem avec la valeur 48
Sub msg22()MsgBox "Test MSG22", 48, "Information fichier"End Sub
'En plus clair
Sub msg3()MsgBox prompt:="Il est l'heure de votre RDV", _Buttons:=vbExclamation, Title:="ATTENTION"End Sub
Tableau des valeurs renvoyées
Constante Valeur Bouton choisi
vbOKOnly 0 Bouton OK uniquement (valeur par défaut)
vbOKCancel 1 Boutons OK et Annuler
vbAbortRetryIgnore 2 Boutons Abandonner, Répéter et Ignorer
vbYesNoCancel 3 Boutons Oui, Non et Annuler
vbYesNo 4 Boutons Oui et Non
vbRetryCancel 5 Boutons Répéter et Annuler
vbCritical 16 Message critique
vbQuestion 32 Requête d'avertissement
vbExclamation 48 Message d'avertissement
vbInformation 64 Message d'information
vbDefaultButton1 0Le premier bouton est le bouton par défaut (valeur par défaut)
vbDefaultButton2 256 Le deuxième bouton est le bouton par défaut
vbDefaultButton3 512 Le troisième bouton est le bouton par défaut
vbDefaultButton4 768 Le quatrième bouton est le bouton par défaut
vbMsgBoxHelpButton 16384 Ajoute le bouton Aide à la boîte de dialogue
Comment faire un saut de ligne ?
Sub msg3()MsgBox "Après ceci... " & Chr(13) & "un saut de ligne"
'ou bien avec la constante
MsgBox "Après ceci..." & vbCrLf & "un saut de ligne" End Sub
'Quelques constantes
vbCr Chr(13) Caractère de saut de paragraphevbLf Chr(10) Caractère de saut de lignevbTab Chr(9) Caractère de tabulationvbBack Chr(8) Caractère de retour arrière
Les Spéciales
Formate une disquette
Sub FormatageDSK()ValRetour = Shell("C:\WINDOWS\RUNDLL32.EXE shell32,SHFormatDrive", 1)End Sub
Change le label d'une disquette
Declare Function SetVolumeLabel Lib "kernel32" Alias "SetVolumeLabelA" _(ByVal lpRootPathName As String, ByVal lpVolumeName As String) As Long
Sub NommeDSK()retval = SetVolumeLabel("a:\", "MaDisquette")
'pour supprimer le label'retval = SetVolumeLabel("a:\", vbNullString)End Sub
Lance un test d'imprimante
Sub LanceTestImp()ValRetour = Shell("C:\WINDOWS\RUNDLL32.EXE msprint2.dll,RUNDLL_PrintTestPage", 1)End Sub
Liste les fichiers excel de c:\ dans le fichier dirxls.xls
'liste les fichiers excel de c:\ Par repertoire Nb de fichiers et taille totale'à la façon du dir de DOS
Sub Dirxls()Shell "command.com /c dir c:\*.xls /W/O/S >C:\ajeter\dirxls.xls", vbHideEnd Sub
'liste les fichiers excel de c:\ dans une simple liste
Sub Dirxls2()Shell "command.com /c dir c:\*.xls /s/b >C:\ajeter\dirxls.xls", vbHideEnd Sub
Imprime la liste de vos favoris en exécutant un fichier BAT (commande DOS)
Sub ImpFichier()Shell "C:\outil\printfav.bat"End Sub
'listing de printfav.bat'à copier dans le bloc-note et à enregistrer sous le nom de "printfav.bat" dans le répertoire C:\outil
@ ECHO OFFECHO Programme d'impression de la liste des FavorisECHO.ECHO.@ECHO ********* QUE SOUHAITEZ-VOUS FAIRE ? ***********@ECHO. @ECHO A: Impression de la liste des favoris.@ECHO B: Quitter le programme.@ECHO.@ECHO.
CHOICE /C:AB Choisir A (Impression), B (Annuler)ECHO.IF ERRORLEVEL 2 GOTO FINIF ERRORLEVEL 1 GOTO imp
: impdir "c:\windows\favoris" /s /b /l > c:\favori.wriwrite c:\favori.wri /p del c:\favori.wri /p GOTO FIN: FINECHO.@ECHO Terminer @ECHO.@ECHO "Cliquer sur la petite croix pour fermer."
Pour fermer la fenêtre DOS automatiquement
il faut ajouter COMMAND.COM /C à la commande SHELL
Sub Exemple()Shell ("command.com /C C:\outil\printfav.bat")End Sub
Lance Explorer en version minimale
Sub LanceExplore()ValRetour = Shell("C:\WINDOWS\RUNDLL32.EXE shell,shellexecute", 1)End Sub
Lance Explorer et ouvre un dossier
Sub ExplorerDossier()Shell "C:\WINDOWS\EXPLORER.EXE /n,/e,D:\FichXls", vbMaximizedFocusEnd Sub
Masque et affiche la barre de tâche windows(97 - XP)
Option Explicit
Dim handleW1 As Long
Private Declare Function FindWindowA Lib "user32" _(ByVal lpClassName As String, _ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" _
(ByVal handleW1 As Long, _ByVal handleW1InsertWhere As Long, ByVal w As Long, _ByVal x As Long, ByVal y As Long, ByVal z As Long, _ByVal wFlags As Long) As Long
Const TOGGLE_HIDEWINDOW = &H80Const TOGGLE_UNHIDEWINDOW = &H40
Sub masque()handleW1 = FindWindowA("Shell_traywnd", "")Call SetWindowPos(handleW1, 0, 0, 0, 0, 0, TOGGLE_HIDEWINDOW)End Sub
Sub affiche()Call SetWindowPos(handleW1, 0, 0, 0, 0, 0, TOGGLE_UNHIDEWINDOW)End Sub
Ferme windows
Sub WinExit() 'marche bien sous XPWith CreateObject("Shell.Application").ShutdownWindowsEnd WithEnd Sub
Sub ExitWindows9598() ValRetour = Shell("C:\WINDOWS\rundll32.exe user.exe,exitwindows")End Sub
Sub RedemarWindows98() ValRetour = Shell("C:\WINDOWS\Rundll32.exe shell32,SHExitWindowsEx")End Sub
Ouvre Internet Explorer
Sub LanceIE()Dim IE As ObjectSet IE = CreateObject("InternetExplorer.Application")IE.Navigate "http://dj.joss.free.fr"IE.AddressBar = TrueIE.MenuBar = TrueIE.Toolbar = TrueIE.Width = 800IE.Height = 600IE.Resizable = TrueIE.Visible = TrueSet IE = NothingEnd Sub
Comment lancer la calculette et l'avoir toujours à l'écran ?
Private Declare Function FindWindow Lib "user32" _Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare Function SetWindowPos Lib "user32" _(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, _ByVal wFlags As Long) As LongPrivate Const HWND_TOPMOST = -1Private Const SWP_NOSIZE = &H1Private Const SWP_NOMOVE = &H2Private Const SWP_SHOWWINDOW = &H40
Les Tests
Pas plus de 10 caractères dans la cellule
Sub testNbCaractere()CellTest = Range("a1").ValueIf Len(CellTest) > 10 ThenMsgBox "Pas plus de 10 caractères", vbOKOnly, "Erreur de caractères"Exit SubEnd IfEnd Sub
Pas de caractères spéciaux dans la cellule
Sub testCaractereSpeciaux()CellTest = Range("B1").Value
For x = 1 To Len(CellTest)Car = Mid(CellTest, x, 1)If Car = ":" Or Car = "!" Or Car = "-" Or Car = "/" Or Car = " " _Or Car = "." Or Car = ";" Or Car = "," Or Car = "\" ThenMsgBox "Pas de caractères spéciaux", vbOKOnly, "Erreur de caractères"Exit SubEnd IfNextEnd Sub
Selon la valeur du nombre
Sub SelonCas()Nombre = ActiveCell.ValueSelect Case Nombre
Case 1 To 5Range("A1").Value = 0
Case 6, 7, 8, 9, 10Range("A1").Value = 1
Case Else Range("A1").Value = 1000
End SelectEnd Sub
Teste la saisie dans une InputBox
Sub testSaisie()Dim saisie As StringDo While saisie = ""saisie = InputBox("Entrez une valeur")LoopEnd Sub
Teste si une touche a été tapée pendant l'éxecution d'une macro.
Lors de l'exécution d'une macro Excel ne teste pas l'utilisation du clavier(sauf Echap)
Declare Function GetAsyncKeyState Lib "User32" _(ByVal vKey As Integer) As Integer
'GetAsyncKeyState est asynchrone - La touche est mémorisée
Sub testToucheA()For y = 1 To 10000Application.StatusBar = y
Next
If (GetAsyncKeyState(65) <> 0) ThenMsgBox "Touche A frappée."End If End Sub
a ou A = 65b ou B = 66 ...etc jusqu'à z ou Z = 90Espace =32
Teste une valeur avec IsNumeric, IsDate et IsEmpty
Utilise la fonction IsNumeric pour tester si une valeur est numérique ou non.
Sub Valeurnum()Dim MaValeur, MaValeur2, MonTest, MonTest2
MaValeur = "4578"MonTest = IsNumeric(MaValeur) 'Retourne VraiMsgBox MonTest
MaValeur = "4578,456"MonTest = IsNumeric(MaValeur) 'Retourne VraiMsgBox MonTest
MaValeur2 = "daniel"MonTest2 = IsNumeric(MaValeur2) 'Retourne FauxMsgBox MonTest2End Sub
Utilise la fonction IsDate pour tester si une valeur est une date.
Sub ValeurDate()Dim MaDate, NonDate, TestDate, TestDate2
MaDate = "02 Mai 2002": NonDate = "Daniel"TestDate = IsDate(MaDate) 'Retourne VraiMsgBox TestDate
TestDate2 = IsDate(NonDate) 'Retourne FauxMsgBox TestDate2End Sub
Utilise la fonction IsEmpty pour tester si une valeur est vide ou non vide.
Sub TestValeurVide()Dim MaValeur, MonTest
MaValeur = Empty 'il y a une valeurMonTest = IsEmpty(MaValeur) ' Test si ma valeur est videMsgBox MonTest 'Retourne Vrai
MaValeur = Null 'il n'y a pas de valeurMonTest = IsEmpty(MaValeur)' Test si ma valeur est vide (EstVide)MsgBox MonTest 'Retourne Faux
MaValeur = Null 'il n'y a pas de valeurMonTest = Not IsEmpty(MaValeur) ' Test si ma valeur n'est pas vide (Non EstVide)MsgBox MonTest 'Retourne VraiEnd Sub
Teste si une macro complémentaire est installée ou non
Ici l'utilitaire d'analyse
Sub testUtilitAnalyse()If AddIns("Utilitaire d'analyse").Installed = True ThenMsgBox "Utilitaire d'analyse installé"Else
MsgBox "Utilitaire d'analyse non installé"End IfEnd Sub
affiche la liste des compléments
Sub afficheComplement()For Each a In AddInsMsgBox a.FullNameNext aEnd Sub
Teste si une cellule est vide ou non vide
Teste et sélectionne les cellules vides de la zone A1:A10
Sub testCelluleVide()[A1:A10].SpecialCells(xlCellTypeBlanks).SelectEnd Sub
Teste et sélectionne les cellules contenant une formuleSub testCelluleformule()[A1:A10].SpecialCells(xlCellTypeFormulas).SelectEnd Sub
Teste et sélectionne les cellules contenant un nombreSub testCellule3()[A1:A10].SpecialCells(xlCellTypeConstants, 1).Select' 2 ème argument =1 (nombre)End Sub
Teste et sélectionne les cellules contenant du texteSub testCelluleText()[A1:A10].SpecialCells(xlCellTypeConstants, 2).Select' 2 ème argument =2 (texte)End Sub
Teste et sélectionne les cellules contenant soit du texte soit une valeurSub testCellule()[A1:A10].SpecialCells(xlCellTypeConstants, 3).Select' 2 ème argument =3 (texte+nombre)End Sub
Teste et sélectionne les cellules contenant un commentaireSub testCelluleText()[A1:A10].SpecialCells(xlCellTypeComments).SelectEnd Sub
Teste si l'option "Déplacement après validation est cochée"Outils>Options>Modifications : "Deplace la sélection après validation"
Sub testDeplacementValidation()If Application.MoveAfterReturn = True ThenMsgBox "Le déplacement après validation est activé"ElseMsgBox "Le déplacement après validation est désactivé"End IfEnd Sub
Sub testDeplacementValidationDroite()Application.MoveAfterReturn = TrueIf Application.MoveAfterReturnDirection = xlToRight ThenMsgBox "Déplacement à droite"End IfEnd Sub
xlToLeft= gauche, xlToRight= droit, xlUp= en haut, ou xlDown= en bas
Exemple d'utilisation:
Sub TestValeurCell()With ActiveCell
Teste si une chaine de caractere a été saisie dans la cellule active
If Application.IsNumber(.Value) = False Then.Clear
teste si le déplacement après validation est cochéedans ce cas il faut remonter d'une cellule pour retourner sur la même celluleIf Application.MoveAfterReturn = True ThenActiveCell.Offset(-1).SelectEnd IfEnd IfEnd With'Retour au testActiveSheet.OnEntry = "TestValeurCell"End Sub
Teste la version d'excel et de l'OS
Sub TestVersionXL()
versionXL = Val(Application.Version)
Select Case versionXL
Case 8MsgBox "Excel (97) version " & Application.VersionMsgBox "Excel Version: " & Application.Version & " Build " & Application.Build _& vbCrLf & vbCrLf & Application.OperatingSystem
Case 9MsgBox "Excel (2000) version " & Application.VersionMsgBox "Excel Version: " & Application.Version & " Build " & Application.Build _& vbCrLf & vbCrLf & Application.OperatingSystem
Case 10MsgBox "Excel (2002) version " & Application.VersionMsgBox "Excel Version: " & Application.Version & " Build " & Application.Build _& vbCrLf & vbCrLf & Application.OperatingSystem
Case 11MsgBox "Excel (2003) version " & Application.VersionMsgBox "Excel Version: " & Application.Version & " Build " & Application.Build _& vbCrLf & vbCrLf & Application.OperatingSystem
Case 12 MsgBox "Excel (2007) version " & Application.VersionMsgBox "Excel Version: " & Application.Version & " Build " & Application.Build _& vbCrLf & vbCrLf & Application.OperatingSystem
Case ElseMsgBox "Autre version"End SelectEnd Sub
Excel et le WEB
Envoi un Mail: l'adresse est dans la cellule D1, le sujet dans la D2 et le texte dans la D3
'Tester avec Outlook Express 5.
Sub EnvoiUnMail()Dim MailAd As StringDim Msg As StringDim Subj As StringDim URLto As StringMailAd = Range("d1")Subj = Range("d2")Msg = Msg & Range("d3")URLto = "mailto:" & MailAd & "?subject=" & Subj & "&body=" & MsgActiveWorkbook.FollowHyperlink Address:=URLtoEnd Sub
Envoie la feuille 1 par Mail
Sub EnvoiFeuilMail()Dim Wbk As Workbook
ThisWorkbook.Sheets("Feuil1").CopySet Wbk = ActiveWorkbookSendKeys "{E}"Wbk.SendMail "[email protected]", "Feuille du contrat à signer", True'true pour un avis de reception
Wbk.Close savechanges:=FalseSet Wbk = NothingEnd Sub
Envoie le classeur actif à plusieurs destinataires. Plage A1:A10
Vous pouvez ajouter des adresses, il suffit de modifier:la référence de la plage A1:A11la boucle 1 To 11et le tableau Array(myadress(11) etc..
Sub EnvoiClasseurAd()Dim myadress(1 To 10)
Set mylst = ActiveSheet.Range("a1:a10")Count = 1
For Each Envoi In mylstIf Len(Envoi) Then myadress(Count) = Envoi: Count = Count + 1Next
ActiveWorkbook.SendMail Recipients:=Array(myadress(1), myadress(2), _myadress(3), myadress(4), myadress(5), myadress(6), myadress(7), _myadress(8), myadress(9), myadress(10)), Subject:=" Voilà le classeur demandé"End Sub
Exporte un graphique en image JPG
Sub GraphJPG()Dim MyChart As ChartSet MyChart = ActiveSheet.ChartObjects(1).ChartMyChart.Export FileName:="C:\ajeter\graph1.jpg", filtername:="JPG"End Sub
Exportation en .gif de la plage sélectionnée - Graphique y compris.
Sub exportgif()Dim Plage As RangeSet Plage = Application.InputBox(Prompt:="Sélectionner votre zone: (Ex. A1:B10) ", _Title:="Sélection de zone ", Default:="$A$1", Type:=8)Application.ScreenUpdating = FalseWorkbooks.AddPlage.CopyPictureActiveSheet.PasteWith ActiveSheet.ChartObjects.Add(0, 0, _Selection.Width, Selection.Height).Chart.Paste.Export "C:\ajeter\Test.gif", "GIF"End WithActiveWorkbook.Close FalseEnd Sub
Teste si une connection est active
Public Const ERROR_SUCCESS = 0&Public Const APINULL = 0&Public Const HKEY_LOCAL_MACHINE = &H80000002Public ReturnCode As Long
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As LongDeclare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As LongDeclare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, _ByVal lpReserved As Long, lpType As Long, _lpData As Any, lpcbData As Long) As LongPrivate Declare Function InternetAutodial Lib "Wininet" _(ByVal dwFlags As Long, ByVal hwndParent As Long) As LongPrivate Declare Function InternetAutodialHangup Lib "wininet.dll" _(ByVal dwReserved As Long) As Long
Public Function ActiveConnection() As BooleanDim hKey As LongDim lpSubKey As StringDim phkResult As LongDim lpValueName As StringDim lpReserved As LongDim lpType As LongDim lpData As LongDim lpcbData As Long
ActiveConnection = FalselpSubKey = "System\CurrentControlSet\Services\RemoteAccess"ReturnCode = RegOpenKey(HKEY_LOCAL_MACHINE, lpSubKey, phkResult)
If ReturnCode = ERROR_SUCCESS ThenhKey = phkResultlpValueName = "Remote Connection"lpReserved = APINULLlpType = APINULLlpData = APINULLlpcbData = APINULLReturnCode = RegQueryValueEx _(hKey, lpValueName, lpReserved, lpType, ByVal lpData, lpcbData)lpcbData = Len(lpData)ReturnCode = RegQueryValueEx _(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData)
If ReturnCode = ERROR_SUCCESS ThenIf lpData = 0 ThenActiveConnection = FalseElseActiveConnection = TrueEnd IfEnd IfRegCloseKey (hKey)End IfEnd Function
Le test de connection
Sub test() If ActiveConnection = True ThenCall MsgBox("Vous avez une connection active.", vbInformation)Else
Call MsgBox("Vous n'avez pas de connection active.", vbInformation)End IfEnd Sub
Avec XP
Private Declare Function InternetGetConnectedState Lib "wininet.dll" _(ByRef lpSFlags As Long, ByVal dwReserved As Long) As Long
Public Function IsConnectedToInternet(Optional ConnectMode As Integer) As BooleanDim lResult As LongIsConnectedToInternet = InternetGetConnectedState(lResult, 0&)ConnectMode = lResultEnd Function
Sub test2()If IsConnectedToInternet = True ThenCall MsgBox("Vous avez une connection active.", vbInformation)ElseCall MsgBox("Vous n'avez pas de connection active.", vbInformation)End IfEnd Sub
Lance la connection
Private Declare Function InternetAutodial Lib "Wininet" _(ByVal dwFlags As Long, ByVal hwndParent As Long) As LongPrivate Declare Function InternetAutodialHangup Lib "wininet.dll" _(ByVal dwReserved As Long) As Long
Sub Connecte()InternetAutodial 1, 0End Sub
Arrête la connection
Sub DéConnecte()InternetAutodialHangup (0&)End Sub
Envoyer un message avec Outlook Express (testé avec Excel 2003)
La variable Dest contient l'adresse de courrier électronique.La variable Sujt contient le sujet du message.La variable Msg contient le corps du message.
Sub MailAvecOE()Dim Dest As StringDim Sujt As String
Dim Msg As StringDest = "[email protected]"Sujt = "Test d'envoi avec Excel"Msg = "Bonjour, Excel vous envoie un message avec OE"Shell "C:\Program Files\Outlook Express\msimn.exe " & _"/mailurl:mailto:" & Dest & "?subject=" & Sujt & "&Body=" & Msg & ""End Sub
Envoyer un message avec un classeur en fichier joint(testé avec Excel 2003)
Sub MailAvecOEClasseur()Dim Dest, Sujt, Msg As StringDim TheFileTheFile = "c:\temp\monfich.xls"Dest = "[email protected]"Sujt = "Test d'envoi avec Excel"Msg = "Bonjour, Excel vous envoie un message et un classeur avec OE"Shell "C:\Program Files\Outlook Express\msimn.exe " & _"/mailurl:mailto:" & Dest & "?subject=" & Sujt & "&Body=" & Msg & ""SendKeys "%I" & "p" & TheFile & "~" & "%s"End Sub
Signification des caractères après "SendKeys":* %I et P = Insertion de la pièce jointe dans Outlook Express. (%=Alt)* ~ = Validation. (~=Entrée)* %S = Envoyer.
Comment envoyer une feuille dans un message en VBA?(testé avec Excel 2003)
Sub MailFeuilleOE()Dim Dest, Sujt, Msg As StringDim RepNameActiveSheet.CopyActiveWorkbook.SaveAs Filename:="C:\temp\test.xls"RepName = "C:\temp\test.xls"Dest = "[email protected]"Sujt = "Test d'envoi d'une feuille avec Excel"Msg = "Bonjour, Excel vous envoie une feuille avec OE"Shell "C:\Program Files\Outlook Express\msimn.exe " & _"/mailurl:mailto:" & Dest & "?subject=" & Sujt & "&Body=" & Msg & ""SendKeys "%I" & "p" & RepName & "~" & "%s"ActiveWorkbook.CloseEnd Sub
Comment envoyer une plage de cellules dans un message en VBA?(testé avec Excel 2003)
Cette macro envoie la plage A1:A10, vous pouvez évidement modifier cette ligne Range("A1:A10").Copypour envoyer une autre plage de cellules.
Sub EnvoiSelectionparMail()Dim Dest, Sujt, Msg As StringDim TheFileRange("A1:A10").CopyWorkbooks.AddActiveSheet.PasteActiveWorkbook.SaveAs Filename:="C:\temp\test.xls"TheFile = "C:\temp\test.xls"Dest = "[email protected]"Sujt = "Test d'envoi avec Excel"Msg = "Bonjour, Excel vous envoie une plage de cellules avec OE"Shell "C:\Program Files\Outlook Express\msimn.exe " & _"/mailurl:mailto:" & Dest & "?subject=" & Sujt & "&Body=" & Msg & ""SendKeys "%I" & "p" & TheFile & "~" & "%s"ActiveWorkbook.CloseEnd Sub
Un message à plusieurs destinataires ( Excel 2003)
La liste des destinaires est dans la plage A1:A10
Sub MailingListe() Dim Dest As StringDim Sujt As StringDim Msg As StringFor Each Lescellules In Range("A1:A10")Dest = Lescellules.ValueSujt = "Test d'envoi avec Excel"Msg = "Bonjour, Excel vous envoie un message avec OE" _& vbNewLine & "Daniel.j"Shell "C:\Program Files\Outlook Express\msimn.exe " & _"/mailurl:mailto:" & Dest & "?subject=" & Sujt & "&Body=" & Msg & ""SendKeys "%s"Next
'et si le texte du message est dans une zone de texte :Msg = Worksheets("le nom de ta feuille").Shapes("Zone de texte 1").TextFrame.Characters.Text
End Sub
Ouvre une page web avec le navigateur par défaut
Private Declare Function ShellExecute Lib "shell32.dll" Alias _"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal _lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As _String, ByVal nShowCmd As Long) As LongPrivate Const SW_SHOWNORMAL As Long = 1
Sub LanceNavigateurPardefaut()Dim Lurl As StringLurl = "http://dj.joss.free.fr/sommaire.htm"ShellExecute hwnd, "open", Lurl, vbNullString, vbNullString, SW_SHOWNORMALEnd Sub
Ouvre une page web et l'enregistre dans un nouveau classeur
Private Declare Function InternetAutodial Lib "Wininet" _(ByVal dwFlags As Long, ByVal hwndParent As Long) As LongPrivate Declare Function InternetAutodialHangup Lib "wininet.dll" _(ByVal dwReserved As Long) As Long
Sub OuvreHTM()InternetAutodial 1, 0On Error Resume NextWorkbooks.OpenText "http:/dj.joss.free.fr/sommaire.htm", xlWindows, _1, xlDelimited, ConsecutiveDelimiter:=False, Tab:=TrueIf Err Then MsgBox Err.Description: Exit SubOn Error GoTo 0ChDir "C:\ajeter\" 'a modifierActiveWorkbook.SaveAs Filename:="lapage.xls"End Sub
'Arrête la connectionSub DéConnecte()InternetAutodialHangup (0&)End Sub
Comment créer une userform?
Création
Crée un nouveau classeurAlt F11Sélectionne le classeur dans la liste et Insertion=>UserformL'userform créée est nommée "Userform1" par défaut
Comment afficher l'userform?
Crée un bouton dans la feuille et affecte lui cette macro:
Sub Lance()Load UserForm1UserForm1.ShowEnd Sub
Load pour charger l'userform en mémoire et Show pour l'afficher.Un clique sur la petite croix en haut à droite pour fermer l'userform.
Comment fermer l'userform avec un bouton?
Dans l'éditeur VB Si la boîte à outils (Contrôle) n'est pas affichée => Menu Affichage=> Boîte à outilsDans la boîte à outils, clique sur le contrôle "Bouton de commande" et place le sur l'userform
Double-clique sur le bouton, un bout de code s'affiche:
Private Sub CommandButton1_Click()
End Sub
Tape cette instruction "Unload UserForm1"Ce qui donne:
Private Sub CommandButton1_Click()Unload UserForm1End Sub
Retourne à la feuille, lance l'userform et un clique sur ce bouton la fermera.
Excel et WordSi vous ne l'avez pas déjà fait :Dans l'éditeur VB, ajoutez une référence à "Microsoft Word 8.0 Object Library"Menu Outils --> Références
Ouvre Word et le fichier Test.doc
Sub ouvreWord()
spécifier le chemin au cas où...Si vous attribuez la valeur 1 au 2 ème argumentl'application s'ouvre à sa taille normale et devient l'application active.
MyAppID = Shell _("C:\Program Files\Microsoft Office\Office\Winword.EXE D:\ajeter\test.doc", 1)AppActivate MyAppIDEnd Sub
Sub ouvreWord2()
'comme celà...
MyAppID = Shell _("C:\Office\Office\Winword.EXE D:\ajeter\test.doc", 1)AppActivate MyAppIDEnd Sub
Sub ouvrwd97()
'où bien comme celà...avec Office 97
MyAppID = Shell _("C:\Office97\Office\Winword.EXE D:\ajeter\test.doc", 1)
AppActivate MyAppIDEnd Sub
Ouvre Word et le fichier Test.doc même avec un espace dans le chemin
Sub ouvrwordAvecEspace()
'Lorsqu'il y a un espace dans le nom du repertoire: ajout de " "
MyAppID = Shell("Winword.EXE ""C:\Mes documents\test.doc""", 1)End Sub
Procédure pour écrire dans Word
Sub EcriDansWord()Dim WordObj As ObjectOn Error Resume NextSet WordObj = CreateObject("Word.Application.8")
'Pour afficher Word
WordObj.Visible = True
'Ajoute un document
WordObj.Documents.Add
With WordObj.Selection.TypeParagraph.TypeText Text:="Procédure pour écrire dans Word ".TypeParagraph.TypeText Text:="Daniel :o)".TypeParagraphEnd With
'pour imprimer le document
WordObj.PrintOut Set WordObj = NothingEnd Sub
Procédure pour exécuter une macro de Word (LancerParXL)
'Macro qui, par exemple, ouvre un document et l'imprime
Sub EcriDansWord()Dim WordObj As ObjectSet WordObj = CreateObject("Word.Application.8")WordObj.Visible = TrueWordObj.Documents.AddWordObj.Run "LancerParXL"End Sub
2 procédures maintenant:La première écrit les commentaires de cellules dans WordLa deuxième écrit les formules. (Auteur=?)
Public Sub PrintCellComments()
Dim Cmt As StringDim C As RangeDim I As IntegerDim WordObj As ObjectDim ws As WorksheetDim PrintValue As BooleanDim res As IntegerOn Error Resume NextErr.Number = 0
res = MsgBox("Voulez-vous éditer les commentaires?", _vbYesNoCancel + vbQuestion, "Edition des commentaires de cellules")Select Case resCase vbCancelExit SubCase vbYesPrintValue = TrueCase ElsePrintValue = FalseEnd SelectSet WordObj = GetObject(, "Word.Application.8")If Err.Number = 429 ThenSet WordObj = CreateObject("Word.Application.8")Err.Number = 0End If
WordObj.Visible = TrueWordObj.Documents.AddWith WordObj.Selection.TypeText Text:="Commentaires dans le classeur: " + ActiveWorkbook.Name.TypeParagraph.TypeText Text:="Date: " + Format(Now(), "dd-mmm-yy hh:mm").TypeParagraph.TypeParagraphEnd With
For Each ws In Worksheets
For I = 1 To ws.Comments.CountSet C = ws.Comments(I).ParentCmt = ws.Comments(I).TextWith WordObj.Selection.TypeText Text:="Commentaire dans la cellule: " + _C.Address(False, False, xlA1) + " feuille: " + ws.NameIf PrintValue = True Then.TypeText Text:=" Cell Value: " + Format(C.Value)End If.TypeParagraph.TypeText Text:=Cmt.TypeParagraph.TypeParagraphEnd WithNext INext ws
Set WordObj = NothingMsgBox "OK...commentaires dans Word", vbInformation, "Edition des Commentaires"End Sub
Public Sub PrintFormulasToWord()
Dim Cnt As StringDim C As RangeDim WordObj As ObjectDim HasArr As Boolean
On Error Resume NextErr.Number = 0
Set WordObj = GetObject(, "Word.Application.8")If Err.Number = 429 ThenSet WordObj = CreateObject("Word.Application.8")Err.Number = 0End If
WordObj.Visible = TrueWordObj.Documents.Add
With WordObj.Selection.Font.Name = "Arial".TypeText "Formules dans la feuille: " + ActiveSheet.Name.TypeParagraph.TypeText "Cells: " + Selection.Cells(1, 1).Address(False, False, xlA1) _& " to " & Selection.Cells(Selection.Rows.Count, Selection.Columns.Count) _.Address(False, False, xlA1).TypeParagraph.TypeParagraphEnd With
For Each C In Selection
HasArr = C.HasArrayCnt = C.FormulaIf HasArr ThenCnt = "{" + Cnt + "}"End IfIf Cnt <> "" ThenWith WordObj.Selection.Font.Bold = True.TypeText C.Address(False, False, xlA1) & ": ".Font.Bold = False.TypeText Cnt.TypeParagraph.TypeParagraphEnd WithEnd IfNext CMsgBox "Edition des formules dans Word. ", , "Formules dans Word"End Sub
Comment envoyer la valeur d'une cellule vers un signet?
'Supposant un document lettre.doc contenant les signets: "Monsignet" et "Monsignet2"
Sub EcritVersSignet()Dim LaLettre As StringDim LeMontantDim LeTexte2Dim ObjWord As Word.ApplicationDim LeDocWord As Word.Document
On Error Resume Next
LaLettre = ThisWorkbook.Path & "\lettre.doc"Set ObjWord = CreateObject("Word.Application")ObjWord.Visible = TrueSet LeDocWord = ObjWord.Documents.Open(LaLettre)LeMontant = [A1]LeTexte2 = [A2]With LeDocWord'Le nom du signet dans le document word est ici "Monsignet".Bookmarks("Monsignet").Range.Text = LeMontant'Le nom du signet dans le document word est ici "Monsignet2".Bookmarks("Monsignet2").Range.Text = LeTexte2End With
'Pour enregistrer le document et quitter Word'LeDocWord.Save'ObjWord.Quit
Set ObjWord = NothingEnd Sub