astuces et code vba pour excel - mcours.net · astuces et code vba pour exce rubriques classeurs...

80
Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres) Fonctions Formules Graphiques Menus Sélection OLE Automation Excel <--> Access (DAO) Commandes diverses Programmes divers ... Téléchargement sur site http://ericrenaud.free.fr/ Les classeurs Excel (Workbooks) Page mise à jour le : 28/03/2001 Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux classeurs. Ajouter des feuilles dans un classeur et les renommer. Enregistrer une copie du classeur (sans modifier le classeur ouvert). Fermer tous les classeurs ouverts sauf le classeur actif. Renommer les onglets d'un classeur (Ex. Mois1, Mois2, Mois3, etc...). Trier les onglets d'un classeur. Ajouter des feuilles dans un classeur et les renommer Sub AjouterRenommerFeuilles() Dim cpt As Integer cpt = 1 Do While cpt < 4 ' Ajoute 3 feuilles ' Ajout d'une feuille Application.Sheets.Add After:=Sheets.Item(Sheets.Count), Type:=xlWorksheet ' Renomme la feuille Application.ActiveSheet.Name = "Semaine " & CStr(cpt) cpt = cpt + 1 Loop End Sub Enregistrer une copie du classeur Sub SaveCopyAs() ActiveWorkbook.SaveCopyAs "C:\excel\MonDouble.xls" End Sub Fermer tous les classeurs ouverts (sauf le classeur actif) Sub FermeClasseurs() For Each Wk In Workbooks If Wk.Name <> ThisWorkbook.Name Then Wk.Close savechanges:=True End If Next Wk

Upload: dinhdat

Post on 13-Sep-2018

263 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Astuces et code VBA pour Exce

Rubriques

Classeurs (Workbooks)

Controcircles et Formulaires

Feuilles (Worksheets)

Fichiers (XL ou autres)

Fonctions

Formules

Graphiques

Menus

Seacutelection

OLE Automation

Excel lt--gt Access (DAO)

Commandes diverses

Programmes divers

Teacuteleacutechargement sur site httpericrenaudfreefr

Les classeurs Excel (Workbooks) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

classeurs

Ajouter des feuilles dans un classeur et les renommer

Enregistrer une copie du classeur (sans modifier le classeur ouvert)

Fermer tous les classeurs ouverts sauf le classeur actif

Renommer les onglets dun classeur (Ex Mois1 Mois2 Mois3 etc)

Trier les onglets dun classeur

Ajouter des feuilles dans un classeur et les renommer

Sub AjouterRenommerFeuilles() Dim cpt As Integer cpt = 1 Do While cpt lt 4 Ajoute 3 feuilles Ajout dune feuille ApplicationSheetsAdd After=SheetsItem(SheetsCount) Type=xlWorksheet Renomme la feuille ApplicationActiveSheetName = Semaine amp CStr(cpt) cpt = cpt + 1 Loop End Sub

Enregistrer une copie du classeur

Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelMonDoublexls End Sub

Fermer tous les classeurs ouverts (sauf le classeur actif)

Sub FermeClasseurs() For Each Wk In Workbooks If WkName ltgt ThisWorkbookName Then WkClose savechanges=True End If Next Wk

End Sub

Renommer les onglets dun classeur

Sub RenommeOnglets() Renomme les onglets CL1 CL2 CL3 etc Dim I As Integer ApplicationScreenUpdating = False For I = 1 To 3 Worksheets(I)Name = CL amp I Next I End Sub

Trier les onglets dun classeur

Sub TriNomsOnglets() Dim I As Integer J As Integer For I = 1 To SheetsCount For J = 1 To I - 1 If UCase(Sheets(I)Name) lt UCase(Sheets(J)Name) Then Sheets(I)Move Before=Sheets(J) Exit For End If Next J Next I End Sub

Controcircles divers en VBA Page mise agrave jour le 14052002

Vous trouverez dans cette rubrique des exemples sur les diffeacuterents controcircles comme

TextBox ComboBox ListBox Bouton doption Case agrave cocher calendrier indicateur de

progression etc

Ces controcircles sutilisent sur un Userform (ou formulaire)

Quelques notions de base

Comment creacuteer un Userform

Depuis une feuille Excel tapez ALT+F11 ou par le menu Outils Macro Visual Basic

Editor

Vous affichez lenvironnement Visual Basic Editor

Inseacuterer un Userform agrave laide du menu Insertion Userform La boicircte agrave outils doit safficher sinon utilisez le menu Affichage Boicircte agrave outils

Pour placer un controcircle sur un Userform

1 - Seacutelectionner le controcircle deacutesireacute dans la fenecirctre Boicircte agrave outils

2 - Cliquer sur le controcircle choisi avec le bouton gauche de la souris et sans relacher

celui-ci deacuteplacer le controcircle vers le Userform puis relacher le bouton de la souris

Voici les principaux controcircles de la boicircte agrave outils (ci-dessous)

Les boicirctes de dialogue

Boite de dialogue avec bouton doption

Le Userform (DlgChoix)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheBoutonsOption() DlgChoixShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() DlgChoixChoixPaireValue = True End Sub Nota A louverture du formulaire la case France est cocheacutee par deacutefaut

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If DlgChoixChoixPaire Then Msg = Vous avez choisi lactiviteacute France Style = vbOKOnly + vbInformation Title = Activiteacute Commerciale - copy E RENAUD - Novembre 1999 Response = MsgBox(Msg Style Title) Else Msg = Vous avez choisi lactiviteacute Export Style = vbOKOnly + vbInformation

Title = Activiteacute Commerciale - copy E RENAUD - Novembre 1999 Response = MsgBox(Msg Style Title) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Boite de dialogue avec case agrave cocher

Le Userform (CasesACocher)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCaseACocher() Range(A3C3)Select SelectionClearContents CasesACocherShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() Remplace la proprieacutete TripleState mise agrave True(CheckBox1) CheckBox1Value = Null CheckBox2Value = False CheckBox3Value = False End Sub Nota A louverture du formulaire la case Franccedilais est cocheacute mais en griseacutee

Code des boutons

1 Bouton OK

Private Sub OK_Click() Dim Langue1 As String Dim Langue2 As String Dim Langue3 As String If CheckBox1Value = False Then Langue1 = Non Else

Langue1 = Oui End If If CheckBox2Value = False Then Langue2 = Non Else Langue2 = Oui End If If CheckBox3 = False Then Langue3 = Non Else Langue3 = Oui End If CasesACocherHide Range(A3)Value = Langue1 Range(B3)Value = Langue2 Range(C3)Value = Langue3 Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() CasesACocherHide End Sub

Le reacutesultat

Boite de dialogue avec liste deacuteroulante

Le Userform (ListeDeroulante)

Le code

Code lanccedilant louverture de la liste deacuteroulante

Sub AfficheListeDeroulante() ListeDeroulanteShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() DerniereMarque = Range(A1)End(xlDown)Address Plage de donneacutees pour afficher dans liste deacuteroulante

MarqueRowSource = A1 amp DerniereMarque Afficher la premiegravere marque de la liste (0 = Fiat) MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteHide Marque est le nom donneacute au controcircle ListBox Index = MarqueListIndex ChoixMarque = MarqueList(Index) Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = ChoixMarque End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() Utilisation de loption AddItem Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Set Liste = Worksheets(1)Cells(1 1)Resize(Worksheets(Feuil1) _ Cells(1 1)CurrentRegionRowsCount - 1 1) NbConstructeurs = ApplicationCountA(Range(A1)EntireColumn) ListeDeroulanteModifiableConstructeurClear ReDim Arr(1 To NbConstructeurs) For I = 1 To NbConstructeurs Arr(I) = Liste(I)Value ListeDeroulanteModifiableConstructeurAddItem Arr(I) Next ConstructeurListIndex = 0 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() ListeDeroulanteModifiableHide ApplicationScreenUpdating = False Constructeur est le nom donneacute au controcircle ComboBox Marque = ConstructeurValue Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = Marque Columns(AA)Select On Error GoTo Ajoute SelectionFind(What=Marque After=ActiveCell LookIn=xlFormulas _ LookAt=xlPart SearchOrder=xlByRows SearchDirection=xlNext _ MatchCase=False)Activate Range(A1)Select Exit Sub Ajoute

Une nouvelle marque eacutetant ajouteacutee ajout de celle-ci agrave la fin de la colonne A Range(A1)End(xlDown)Offset(1 0)Value = Marque Tri des marques en ordre croissant SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Seacutelectionne la plage et recolore la plage des marques apregraves ajout nouvelle marque With Worksheets(1) Range([A1] [A1]End(xlDown))Select End With With SelectionInterior ColorIndex = 20 PatternColorIndex = xlAutomatic End With Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() MeConstructeurRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() MeConstructeurListIndex = -1 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() MeHide If MeConstructeurListIndex = -1 Then Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MeConstructeurValue Tri de la plage de donneacutees suite agrave lajout dun eacuteleacutement Sheets(Feuil1)Range([A1] [A1]End(xlDown))Select SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Else End If Mise en place de la valeur choisie en D2 Sheets(Feuil1)Cells(2 4)Value = MeConstructeurValue End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec seacutelection multiple dans liste deacuteroulante

Le Userform (DlgChoixMultiple)

Les controcircles

Nom de la ListBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteMultiSelect() DlgChoixMutlipleShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear Proprieacuteteacute Multiselect du controcircle ListeClients mis sur fmMultiSelectExtended ListeClientsMultiSelect = fmMultiSelectExtended End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixMultipleHide j = 1 With ListeClients For i = 0 To ListCount - 1 If Selected(i) = True Then Le reacutesultat est placeacute dans les colonnes D et E de la feuille Feuil1 Cells(j 4) = List(i 0) Cells(j 5) = List(i 1) Selected(i) = False j = j + 1 End If Next End With End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixMultipleHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire

(voir image du Userform au deacutebut de la page)

Boite de dialogue avec liste deacuteroulante agrave 2 colonnes

Le Userform (DlgChoix)

Les controcircles

Nom de la ComboBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Quelques proprieacuteteacutes du controcircle ListeClients

ColumnCount = 2 (Nbre de colonne agrave afficher dans une zone de liste) ColumnWidths = 40 (Largeur de chaque colonne dune zone de liste agrave plusieurs colonnes)

Height = 18 (Hauteur en points dun objet) ListWidth = 190 (Largeur de la liste dun controcircle ComboBox) Width = 78 (largeur en points dun objet)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulante() DlgChoixShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 2: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

End Sub

Renommer les onglets dun classeur

Sub RenommeOnglets() Renomme les onglets CL1 CL2 CL3 etc Dim I As Integer ApplicationScreenUpdating = False For I = 1 To 3 Worksheets(I)Name = CL amp I Next I End Sub

Trier les onglets dun classeur

Sub TriNomsOnglets() Dim I As Integer J As Integer For I = 1 To SheetsCount For J = 1 To I - 1 If UCase(Sheets(I)Name) lt UCase(Sheets(J)Name) Then Sheets(I)Move Before=Sheets(J) Exit For End If Next J Next I End Sub

Controcircles divers en VBA Page mise agrave jour le 14052002

Vous trouverez dans cette rubrique des exemples sur les diffeacuterents controcircles comme

TextBox ComboBox ListBox Bouton doption Case agrave cocher calendrier indicateur de

progression etc

Ces controcircles sutilisent sur un Userform (ou formulaire)

Quelques notions de base

Comment creacuteer un Userform

Depuis une feuille Excel tapez ALT+F11 ou par le menu Outils Macro Visual Basic

Editor

Vous affichez lenvironnement Visual Basic Editor

Inseacuterer un Userform agrave laide du menu Insertion Userform La boicircte agrave outils doit safficher sinon utilisez le menu Affichage Boicircte agrave outils

Pour placer un controcircle sur un Userform

1 - Seacutelectionner le controcircle deacutesireacute dans la fenecirctre Boicircte agrave outils

2 - Cliquer sur le controcircle choisi avec le bouton gauche de la souris et sans relacher

celui-ci deacuteplacer le controcircle vers le Userform puis relacher le bouton de la souris

Voici les principaux controcircles de la boicircte agrave outils (ci-dessous)

Les boicirctes de dialogue

Boite de dialogue avec bouton doption

Le Userform (DlgChoix)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheBoutonsOption() DlgChoixShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() DlgChoixChoixPaireValue = True End Sub Nota A louverture du formulaire la case France est cocheacutee par deacutefaut

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If DlgChoixChoixPaire Then Msg = Vous avez choisi lactiviteacute France Style = vbOKOnly + vbInformation Title = Activiteacute Commerciale - copy E RENAUD - Novembre 1999 Response = MsgBox(Msg Style Title) Else Msg = Vous avez choisi lactiviteacute Export Style = vbOKOnly + vbInformation

Title = Activiteacute Commerciale - copy E RENAUD - Novembre 1999 Response = MsgBox(Msg Style Title) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Boite de dialogue avec case agrave cocher

Le Userform (CasesACocher)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCaseACocher() Range(A3C3)Select SelectionClearContents CasesACocherShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() Remplace la proprieacutete TripleState mise agrave True(CheckBox1) CheckBox1Value = Null CheckBox2Value = False CheckBox3Value = False End Sub Nota A louverture du formulaire la case Franccedilais est cocheacute mais en griseacutee

Code des boutons

1 Bouton OK

Private Sub OK_Click() Dim Langue1 As String Dim Langue2 As String Dim Langue3 As String If CheckBox1Value = False Then Langue1 = Non Else

Langue1 = Oui End If If CheckBox2Value = False Then Langue2 = Non Else Langue2 = Oui End If If CheckBox3 = False Then Langue3 = Non Else Langue3 = Oui End If CasesACocherHide Range(A3)Value = Langue1 Range(B3)Value = Langue2 Range(C3)Value = Langue3 Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() CasesACocherHide End Sub

Le reacutesultat

Boite de dialogue avec liste deacuteroulante

Le Userform (ListeDeroulante)

Le code

Code lanccedilant louverture de la liste deacuteroulante

Sub AfficheListeDeroulante() ListeDeroulanteShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() DerniereMarque = Range(A1)End(xlDown)Address Plage de donneacutees pour afficher dans liste deacuteroulante

MarqueRowSource = A1 amp DerniereMarque Afficher la premiegravere marque de la liste (0 = Fiat) MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteHide Marque est le nom donneacute au controcircle ListBox Index = MarqueListIndex ChoixMarque = MarqueList(Index) Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = ChoixMarque End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() Utilisation de loption AddItem Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Set Liste = Worksheets(1)Cells(1 1)Resize(Worksheets(Feuil1) _ Cells(1 1)CurrentRegionRowsCount - 1 1) NbConstructeurs = ApplicationCountA(Range(A1)EntireColumn) ListeDeroulanteModifiableConstructeurClear ReDim Arr(1 To NbConstructeurs) For I = 1 To NbConstructeurs Arr(I) = Liste(I)Value ListeDeroulanteModifiableConstructeurAddItem Arr(I) Next ConstructeurListIndex = 0 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() ListeDeroulanteModifiableHide ApplicationScreenUpdating = False Constructeur est le nom donneacute au controcircle ComboBox Marque = ConstructeurValue Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = Marque Columns(AA)Select On Error GoTo Ajoute SelectionFind(What=Marque After=ActiveCell LookIn=xlFormulas _ LookAt=xlPart SearchOrder=xlByRows SearchDirection=xlNext _ MatchCase=False)Activate Range(A1)Select Exit Sub Ajoute

Une nouvelle marque eacutetant ajouteacutee ajout de celle-ci agrave la fin de la colonne A Range(A1)End(xlDown)Offset(1 0)Value = Marque Tri des marques en ordre croissant SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Seacutelectionne la plage et recolore la plage des marques apregraves ajout nouvelle marque With Worksheets(1) Range([A1] [A1]End(xlDown))Select End With With SelectionInterior ColorIndex = 20 PatternColorIndex = xlAutomatic End With Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() MeConstructeurRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() MeConstructeurListIndex = -1 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() MeHide If MeConstructeurListIndex = -1 Then Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MeConstructeurValue Tri de la plage de donneacutees suite agrave lajout dun eacuteleacutement Sheets(Feuil1)Range([A1] [A1]End(xlDown))Select SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Else End If Mise en place de la valeur choisie en D2 Sheets(Feuil1)Cells(2 4)Value = MeConstructeurValue End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec seacutelection multiple dans liste deacuteroulante

Le Userform (DlgChoixMultiple)

Les controcircles

Nom de la ListBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteMultiSelect() DlgChoixMutlipleShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear Proprieacuteteacute Multiselect du controcircle ListeClients mis sur fmMultiSelectExtended ListeClientsMultiSelect = fmMultiSelectExtended End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixMultipleHide j = 1 With ListeClients For i = 0 To ListCount - 1 If Selected(i) = True Then Le reacutesultat est placeacute dans les colonnes D et E de la feuille Feuil1 Cells(j 4) = List(i 0) Cells(j 5) = List(i 1) Selected(i) = False j = j + 1 End If Next End With End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixMultipleHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire

(voir image du Userform au deacutebut de la page)

Boite de dialogue avec liste deacuteroulante agrave 2 colonnes

Le Userform (DlgChoix)

Les controcircles

Nom de la ComboBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Quelques proprieacuteteacutes du controcircle ListeClients

ColumnCount = 2 (Nbre de colonne agrave afficher dans une zone de liste) ColumnWidths = 40 (Largeur de chaque colonne dune zone de liste agrave plusieurs colonnes)

Height = 18 (Hauteur en points dun objet) ListWidth = 190 (Largeur de la liste dun controcircle ComboBox) Width = 78 (largeur en points dun objet)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulante() DlgChoixShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 3: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Les boicirctes de dialogue

Boite de dialogue avec bouton doption

Le Userform (DlgChoix)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheBoutonsOption() DlgChoixShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() DlgChoixChoixPaireValue = True End Sub Nota A louverture du formulaire la case France est cocheacutee par deacutefaut

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If DlgChoixChoixPaire Then Msg = Vous avez choisi lactiviteacute France Style = vbOKOnly + vbInformation Title = Activiteacute Commerciale - copy E RENAUD - Novembre 1999 Response = MsgBox(Msg Style Title) Else Msg = Vous avez choisi lactiviteacute Export Style = vbOKOnly + vbInformation

Title = Activiteacute Commerciale - copy E RENAUD - Novembre 1999 Response = MsgBox(Msg Style Title) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Boite de dialogue avec case agrave cocher

Le Userform (CasesACocher)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCaseACocher() Range(A3C3)Select SelectionClearContents CasesACocherShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() Remplace la proprieacutete TripleState mise agrave True(CheckBox1) CheckBox1Value = Null CheckBox2Value = False CheckBox3Value = False End Sub Nota A louverture du formulaire la case Franccedilais est cocheacute mais en griseacutee

Code des boutons

1 Bouton OK

Private Sub OK_Click() Dim Langue1 As String Dim Langue2 As String Dim Langue3 As String If CheckBox1Value = False Then Langue1 = Non Else

Langue1 = Oui End If If CheckBox2Value = False Then Langue2 = Non Else Langue2 = Oui End If If CheckBox3 = False Then Langue3 = Non Else Langue3 = Oui End If CasesACocherHide Range(A3)Value = Langue1 Range(B3)Value = Langue2 Range(C3)Value = Langue3 Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() CasesACocherHide End Sub

Le reacutesultat

Boite de dialogue avec liste deacuteroulante

Le Userform (ListeDeroulante)

Le code

Code lanccedilant louverture de la liste deacuteroulante

Sub AfficheListeDeroulante() ListeDeroulanteShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() DerniereMarque = Range(A1)End(xlDown)Address Plage de donneacutees pour afficher dans liste deacuteroulante

MarqueRowSource = A1 amp DerniereMarque Afficher la premiegravere marque de la liste (0 = Fiat) MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteHide Marque est le nom donneacute au controcircle ListBox Index = MarqueListIndex ChoixMarque = MarqueList(Index) Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = ChoixMarque End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() Utilisation de loption AddItem Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Set Liste = Worksheets(1)Cells(1 1)Resize(Worksheets(Feuil1) _ Cells(1 1)CurrentRegionRowsCount - 1 1) NbConstructeurs = ApplicationCountA(Range(A1)EntireColumn) ListeDeroulanteModifiableConstructeurClear ReDim Arr(1 To NbConstructeurs) For I = 1 To NbConstructeurs Arr(I) = Liste(I)Value ListeDeroulanteModifiableConstructeurAddItem Arr(I) Next ConstructeurListIndex = 0 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() ListeDeroulanteModifiableHide ApplicationScreenUpdating = False Constructeur est le nom donneacute au controcircle ComboBox Marque = ConstructeurValue Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = Marque Columns(AA)Select On Error GoTo Ajoute SelectionFind(What=Marque After=ActiveCell LookIn=xlFormulas _ LookAt=xlPart SearchOrder=xlByRows SearchDirection=xlNext _ MatchCase=False)Activate Range(A1)Select Exit Sub Ajoute

Une nouvelle marque eacutetant ajouteacutee ajout de celle-ci agrave la fin de la colonne A Range(A1)End(xlDown)Offset(1 0)Value = Marque Tri des marques en ordre croissant SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Seacutelectionne la plage et recolore la plage des marques apregraves ajout nouvelle marque With Worksheets(1) Range([A1] [A1]End(xlDown))Select End With With SelectionInterior ColorIndex = 20 PatternColorIndex = xlAutomatic End With Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() MeConstructeurRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() MeConstructeurListIndex = -1 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() MeHide If MeConstructeurListIndex = -1 Then Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MeConstructeurValue Tri de la plage de donneacutees suite agrave lajout dun eacuteleacutement Sheets(Feuil1)Range([A1] [A1]End(xlDown))Select SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Else End If Mise en place de la valeur choisie en D2 Sheets(Feuil1)Cells(2 4)Value = MeConstructeurValue End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec seacutelection multiple dans liste deacuteroulante

Le Userform (DlgChoixMultiple)

Les controcircles

Nom de la ListBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteMultiSelect() DlgChoixMutlipleShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear Proprieacuteteacute Multiselect du controcircle ListeClients mis sur fmMultiSelectExtended ListeClientsMultiSelect = fmMultiSelectExtended End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixMultipleHide j = 1 With ListeClients For i = 0 To ListCount - 1 If Selected(i) = True Then Le reacutesultat est placeacute dans les colonnes D et E de la feuille Feuil1 Cells(j 4) = List(i 0) Cells(j 5) = List(i 1) Selected(i) = False j = j + 1 End If Next End With End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixMultipleHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire

(voir image du Userform au deacutebut de la page)

Boite de dialogue avec liste deacuteroulante agrave 2 colonnes

Le Userform (DlgChoix)

Les controcircles

Nom de la ComboBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Quelques proprieacuteteacutes du controcircle ListeClients

ColumnCount = 2 (Nbre de colonne agrave afficher dans une zone de liste) ColumnWidths = 40 (Largeur de chaque colonne dune zone de liste agrave plusieurs colonnes)

Height = 18 (Hauteur en points dun objet) ListWidth = 190 (Largeur de la liste dun controcircle ComboBox) Width = 78 (largeur en points dun objet)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulante() DlgChoixShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 4: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Title = Activiteacute Commerciale - copy E RENAUD - Novembre 1999 Response = MsgBox(Msg Style Title) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Boite de dialogue avec case agrave cocher

Le Userform (CasesACocher)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCaseACocher() Range(A3C3)Select SelectionClearContents CasesACocherShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() Remplace la proprieacutete TripleState mise agrave True(CheckBox1) CheckBox1Value = Null CheckBox2Value = False CheckBox3Value = False End Sub Nota A louverture du formulaire la case Franccedilais est cocheacute mais en griseacutee

Code des boutons

1 Bouton OK

Private Sub OK_Click() Dim Langue1 As String Dim Langue2 As String Dim Langue3 As String If CheckBox1Value = False Then Langue1 = Non Else

Langue1 = Oui End If If CheckBox2Value = False Then Langue2 = Non Else Langue2 = Oui End If If CheckBox3 = False Then Langue3 = Non Else Langue3 = Oui End If CasesACocherHide Range(A3)Value = Langue1 Range(B3)Value = Langue2 Range(C3)Value = Langue3 Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() CasesACocherHide End Sub

Le reacutesultat

Boite de dialogue avec liste deacuteroulante

Le Userform (ListeDeroulante)

Le code

Code lanccedilant louverture de la liste deacuteroulante

Sub AfficheListeDeroulante() ListeDeroulanteShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() DerniereMarque = Range(A1)End(xlDown)Address Plage de donneacutees pour afficher dans liste deacuteroulante

MarqueRowSource = A1 amp DerniereMarque Afficher la premiegravere marque de la liste (0 = Fiat) MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteHide Marque est le nom donneacute au controcircle ListBox Index = MarqueListIndex ChoixMarque = MarqueList(Index) Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = ChoixMarque End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() Utilisation de loption AddItem Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Set Liste = Worksheets(1)Cells(1 1)Resize(Worksheets(Feuil1) _ Cells(1 1)CurrentRegionRowsCount - 1 1) NbConstructeurs = ApplicationCountA(Range(A1)EntireColumn) ListeDeroulanteModifiableConstructeurClear ReDim Arr(1 To NbConstructeurs) For I = 1 To NbConstructeurs Arr(I) = Liste(I)Value ListeDeroulanteModifiableConstructeurAddItem Arr(I) Next ConstructeurListIndex = 0 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() ListeDeroulanteModifiableHide ApplicationScreenUpdating = False Constructeur est le nom donneacute au controcircle ComboBox Marque = ConstructeurValue Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = Marque Columns(AA)Select On Error GoTo Ajoute SelectionFind(What=Marque After=ActiveCell LookIn=xlFormulas _ LookAt=xlPart SearchOrder=xlByRows SearchDirection=xlNext _ MatchCase=False)Activate Range(A1)Select Exit Sub Ajoute

Une nouvelle marque eacutetant ajouteacutee ajout de celle-ci agrave la fin de la colonne A Range(A1)End(xlDown)Offset(1 0)Value = Marque Tri des marques en ordre croissant SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Seacutelectionne la plage et recolore la plage des marques apregraves ajout nouvelle marque With Worksheets(1) Range([A1] [A1]End(xlDown))Select End With With SelectionInterior ColorIndex = 20 PatternColorIndex = xlAutomatic End With Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() MeConstructeurRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() MeConstructeurListIndex = -1 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() MeHide If MeConstructeurListIndex = -1 Then Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MeConstructeurValue Tri de la plage de donneacutees suite agrave lajout dun eacuteleacutement Sheets(Feuil1)Range([A1] [A1]End(xlDown))Select SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Else End If Mise en place de la valeur choisie en D2 Sheets(Feuil1)Cells(2 4)Value = MeConstructeurValue End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec seacutelection multiple dans liste deacuteroulante

Le Userform (DlgChoixMultiple)

Les controcircles

Nom de la ListBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteMultiSelect() DlgChoixMutlipleShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear Proprieacuteteacute Multiselect du controcircle ListeClients mis sur fmMultiSelectExtended ListeClientsMultiSelect = fmMultiSelectExtended End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixMultipleHide j = 1 With ListeClients For i = 0 To ListCount - 1 If Selected(i) = True Then Le reacutesultat est placeacute dans les colonnes D et E de la feuille Feuil1 Cells(j 4) = List(i 0) Cells(j 5) = List(i 1) Selected(i) = False j = j + 1 End If Next End With End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixMultipleHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire

(voir image du Userform au deacutebut de la page)

Boite de dialogue avec liste deacuteroulante agrave 2 colonnes

Le Userform (DlgChoix)

Les controcircles

Nom de la ComboBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Quelques proprieacuteteacutes du controcircle ListeClients

ColumnCount = 2 (Nbre de colonne agrave afficher dans une zone de liste) ColumnWidths = 40 (Largeur de chaque colonne dune zone de liste agrave plusieurs colonnes)

Height = 18 (Hauteur en points dun objet) ListWidth = 190 (Largeur de la liste dun controcircle ComboBox) Width = 78 (largeur en points dun objet)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulante() DlgChoixShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 5: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Langue1 = Oui End If If CheckBox2Value = False Then Langue2 = Non Else Langue2 = Oui End If If CheckBox3 = False Then Langue3 = Non Else Langue3 = Oui End If CasesACocherHide Range(A3)Value = Langue1 Range(B3)Value = Langue2 Range(C3)Value = Langue3 Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() CasesACocherHide End Sub

Le reacutesultat

Boite de dialogue avec liste deacuteroulante

Le Userform (ListeDeroulante)

Le code

Code lanccedilant louverture de la liste deacuteroulante

Sub AfficheListeDeroulante() ListeDeroulanteShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() DerniereMarque = Range(A1)End(xlDown)Address Plage de donneacutees pour afficher dans liste deacuteroulante

MarqueRowSource = A1 amp DerniereMarque Afficher la premiegravere marque de la liste (0 = Fiat) MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteHide Marque est le nom donneacute au controcircle ListBox Index = MarqueListIndex ChoixMarque = MarqueList(Index) Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = ChoixMarque End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() Utilisation de loption AddItem Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Set Liste = Worksheets(1)Cells(1 1)Resize(Worksheets(Feuil1) _ Cells(1 1)CurrentRegionRowsCount - 1 1) NbConstructeurs = ApplicationCountA(Range(A1)EntireColumn) ListeDeroulanteModifiableConstructeurClear ReDim Arr(1 To NbConstructeurs) For I = 1 To NbConstructeurs Arr(I) = Liste(I)Value ListeDeroulanteModifiableConstructeurAddItem Arr(I) Next ConstructeurListIndex = 0 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() ListeDeroulanteModifiableHide ApplicationScreenUpdating = False Constructeur est le nom donneacute au controcircle ComboBox Marque = ConstructeurValue Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = Marque Columns(AA)Select On Error GoTo Ajoute SelectionFind(What=Marque After=ActiveCell LookIn=xlFormulas _ LookAt=xlPart SearchOrder=xlByRows SearchDirection=xlNext _ MatchCase=False)Activate Range(A1)Select Exit Sub Ajoute

Une nouvelle marque eacutetant ajouteacutee ajout de celle-ci agrave la fin de la colonne A Range(A1)End(xlDown)Offset(1 0)Value = Marque Tri des marques en ordre croissant SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Seacutelectionne la plage et recolore la plage des marques apregraves ajout nouvelle marque With Worksheets(1) Range([A1] [A1]End(xlDown))Select End With With SelectionInterior ColorIndex = 20 PatternColorIndex = xlAutomatic End With Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() MeConstructeurRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() MeConstructeurListIndex = -1 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() MeHide If MeConstructeurListIndex = -1 Then Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MeConstructeurValue Tri de la plage de donneacutees suite agrave lajout dun eacuteleacutement Sheets(Feuil1)Range([A1] [A1]End(xlDown))Select SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Else End If Mise en place de la valeur choisie en D2 Sheets(Feuil1)Cells(2 4)Value = MeConstructeurValue End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec seacutelection multiple dans liste deacuteroulante

Le Userform (DlgChoixMultiple)

Les controcircles

Nom de la ListBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteMultiSelect() DlgChoixMutlipleShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear Proprieacuteteacute Multiselect du controcircle ListeClients mis sur fmMultiSelectExtended ListeClientsMultiSelect = fmMultiSelectExtended End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixMultipleHide j = 1 With ListeClients For i = 0 To ListCount - 1 If Selected(i) = True Then Le reacutesultat est placeacute dans les colonnes D et E de la feuille Feuil1 Cells(j 4) = List(i 0) Cells(j 5) = List(i 1) Selected(i) = False j = j + 1 End If Next End With End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixMultipleHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire

(voir image du Userform au deacutebut de la page)

Boite de dialogue avec liste deacuteroulante agrave 2 colonnes

Le Userform (DlgChoix)

Les controcircles

Nom de la ComboBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Quelques proprieacuteteacutes du controcircle ListeClients

ColumnCount = 2 (Nbre de colonne agrave afficher dans une zone de liste) ColumnWidths = 40 (Largeur de chaque colonne dune zone de liste agrave plusieurs colonnes)

Height = 18 (Hauteur en points dun objet) ListWidth = 190 (Largeur de la liste dun controcircle ComboBox) Width = 78 (largeur en points dun objet)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulante() DlgChoixShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 6: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

MarqueRowSource = A1 amp DerniereMarque Afficher la premiegravere marque de la liste (0 = Fiat) MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteHide Marque est le nom donneacute au controcircle ListBox Index = MarqueListIndex ChoixMarque = MarqueList(Index) Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = ChoixMarque End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() Utilisation de loption AddItem Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Set Liste = Worksheets(1)Cells(1 1)Resize(Worksheets(Feuil1) _ Cells(1 1)CurrentRegionRowsCount - 1 1) NbConstructeurs = ApplicationCountA(Range(A1)EntireColumn) ListeDeroulanteModifiableConstructeurClear ReDim Arr(1 To NbConstructeurs) For I = 1 To NbConstructeurs Arr(I) = Liste(I)Value ListeDeroulanteModifiableConstructeurAddItem Arr(I) Next ConstructeurListIndex = 0 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() ListeDeroulanteModifiableHide ApplicationScreenUpdating = False Constructeur est le nom donneacute au controcircle ComboBox Marque = ConstructeurValue Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = Marque Columns(AA)Select On Error GoTo Ajoute SelectionFind(What=Marque After=ActiveCell LookIn=xlFormulas _ LookAt=xlPart SearchOrder=xlByRows SearchDirection=xlNext _ MatchCase=False)Activate Range(A1)Select Exit Sub Ajoute

Une nouvelle marque eacutetant ajouteacutee ajout de celle-ci agrave la fin de la colonne A Range(A1)End(xlDown)Offset(1 0)Value = Marque Tri des marques en ordre croissant SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Seacutelectionne la plage et recolore la plage des marques apregraves ajout nouvelle marque With Worksheets(1) Range([A1] [A1]End(xlDown))Select End With With SelectionInterior ColorIndex = 20 PatternColorIndex = xlAutomatic End With Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() MeConstructeurRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() MeConstructeurListIndex = -1 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() MeHide If MeConstructeurListIndex = -1 Then Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MeConstructeurValue Tri de la plage de donneacutees suite agrave lajout dun eacuteleacutement Sheets(Feuil1)Range([A1] [A1]End(xlDown))Select SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Else End If Mise en place de la valeur choisie en D2 Sheets(Feuil1)Cells(2 4)Value = MeConstructeurValue End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec seacutelection multiple dans liste deacuteroulante

Le Userform (DlgChoixMultiple)

Les controcircles

Nom de la ListBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteMultiSelect() DlgChoixMutlipleShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear Proprieacuteteacute Multiselect du controcircle ListeClients mis sur fmMultiSelectExtended ListeClientsMultiSelect = fmMultiSelectExtended End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixMultipleHide j = 1 With ListeClients For i = 0 To ListCount - 1 If Selected(i) = True Then Le reacutesultat est placeacute dans les colonnes D et E de la feuille Feuil1 Cells(j 4) = List(i 0) Cells(j 5) = List(i 1) Selected(i) = False j = j + 1 End If Next End With End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixMultipleHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire

(voir image du Userform au deacutebut de la page)

Boite de dialogue avec liste deacuteroulante agrave 2 colonnes

Le Userform (DlgChoix)

Les controcircles

Nom de la ComboBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Quelques proprieacuteteacutes du controcircle ListeClients

ColumnCount = 2 (Nbre de colonne agrave afficher dans une zone de liste) ColumnWidths = 40 (Largeur de chaque colonne dune zone de liste agrave plusieurs colonnes)

Height = 18 (Hauteur en points dun objet) ListWidth = 190 (Largeur de la liste dun controcircle ComboBox) Width = 78 (largeur en points dun objet)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulante() DlgChoixShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 7: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() Utilisation de loption AddItem Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Set Liste = Worksheets(1)Cells(1 1)Resize(Worksheets(Feuil1) _ Cells(1 1)CurrentRegionRowsCount - 1 1) NbConstructeurs = ApplicationCountA(Range(A1)EntireColumn) ListeDeroulanteModifiableConstructeurClear ReDim Arr(1 To NbConstructeurs) For I = 1 To NbConstructeurs Arr(I) = Liste(I)Value ListeDeroulanteModifiableConstructeurAddItem Arr(I) Next ConstructeurListIndex = 0 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() ListeDeroulanteModifiableHide ApplicationScreenUpdating = False Constructeur est le nom donneacute au controcircle ComboBox Marque = ConstructeurValue Stockage du choix effectueacute dans la liste deacuteroulante en D2 Range(D2)Value = Marque Columns(AA)Select On Error GoTo Ajoute SelectionFind(What=Marque After=ActiveCell LookIn=xlFormulas _ LookAt=xlPart SearchOrder=xlByRows SearchDirection=xlNext _ MatchCase=False)Activate Range(A1)Select Exit Sub Ajoute

Une nouvelle marque eacutetant ajouteacutee ajout de celle-ci agrave la fin de la colonne A Range(A1)End(xlDown)Offset(1 0)Value = Marque Tri des marques en ordre croissant SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Seacutelectionne la plage et recolore la plage des marques apregraves ajout nouvelle marque With Worksheets(1) Range([A1] [A1]End(xlDown))Select End With With SelectionInterior ColorIndex = 20 PatternColorIndex = xlAutomatic End With Range(A1)Select End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() MeConstructeurRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() MeConstructeurListIndex = -1 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() MeHide If MeConstructeurListIndex = -1 Then Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MeConstructeurValue Tri de la plage de donneacutees suite agrave lajout dun eacuteleacutement Sheets(Feuil1)Range([A1] [A1]End(xlDown))Select SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Else End If Mise en place de la valeur choisie en D2 Sheets(Feuil1)Cells(2 4)Value = MeConstructeurValue End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec seacutelection multiple dans liste deacuteroulante

Le Userform (DlgChoixMultiple)

Les controcircles

Nom de la ListBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteMultiSelect() DlgChoixMutlipleShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear Proprieacuteteacute Multiselect du controcircle ListeClients mis sur fmMultiSelectExtended ListeClientsMultiSelect = fmMultiSelectExtended End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixMultipleHide j = 1 With ListeClients For i = 0 To ListCount - 1 If Selected(i) = True Then Le reacutesultat est placeacute dans les colonnes D et E de la feuille Feuil1 Cells(j 4) = List(i 0) Cells(j 5) = List(i 1) Selected(i) = False j = j + 1 End If Next End With End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixMultipleHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire

(voir image du Userform au deacutebut de la page)

Boite de dialogue avec liste deacuteroulante agrave 2 colonnes

Le Userform (DlgChoix)

Les controcircles

Nom de la ComboBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Quelques proprieacuteteacutes du controcircle ListeClients

ColumnCount = 2 (Nbre de colonne agrave afficher dans une zone de liste) ColumnWidths = 40 (Largeur de chaque colonne dune zone de liste agrave plusieurs colonnes)

Height = 18 (Hauteur en points dun objet) ListWidth = 190 (Largeur de la liste dun controcircle ComboBox) Width = 78 (largeur en points dun objet)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulante() DlgChoixShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 8: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Le Userform (ListeDeroulanteModifiable)

Les controcircles

Nom de la ComboBox = Constructeur Nom du CommandButton Valider Choix = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteModifiable() ListeDeroulanteModifiableShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() MeConstructeurRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() MeConstructeurListIndex = -1 End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() MeHide If MeConstructeurListIndex = -1 Then Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MeConstructeurValue Tri de la plage de donneacutees suite agrave lajout dun eacuteleacutement Sheets(Feuil1)Range([A1] [A1]End(xlDown))Select SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Else End If Mise en place de la valeur choisie en D2 Sheets(Feuil1)Cells(2 4)Value = MeConstructeurValue End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec seacutelection multiple dans liste deacuteroulante

Le Userform (DlgChoixMultiple)

Les controcircles

Nom de la ListBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteMultiSelect() DlgChoixMutlipleShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear Proprieacuteteacute Multiselect du controcircle ListeClients mis sur fmMultiSelectExtended ListeClientsMultiSelect = fmMultiSelectExtended End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixMultipleHide j = 1 With ListeClients For i = 0 To ListCount - 1 If Selected(i) = True Then Le reacutesultat est placeacute dans les colonnes D et E de la feuille Feuil1 Cells(j 4) = List(i 0) Cells(j 5) = List(i 1) Selected(i) = False j = j + 1 End If Next End With End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixMultipleHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire

(voir image du Userform au deacutebut de la page)

Boite de dialogue avec liste deacuteroulante agrave 2 colonnes

Le Userform (DlgChoix)

Les controcircles

Nom de la ComboBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Quelques proprieacuteteacutes du controcircle ListeClients

ColumnCount = 2 (Nbre de colonne agrave afficher dans une zone de liste) ColumnWidths = 40 (Largeur de chaque colonne dune zone de liste agrave plusieurs colonnes)

Height = 18 (Hauteur en points dun objet) ListWidth = 190 (Largeur de la liste dun controcircle ComboBox) Width = 78 (largeur en points dun objet)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulante() DlgChoixShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 9: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Code des boutons

1 Bouton OK

Private Sub OK_Click() MeHide If MeConstructeurListIndex = -1 Then Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MeConstructeurValue Tri de la plage de donneacutees suite agrave lajout dun eacuteleacutement Sheets(Feuil1)Range([A1] [A1]End(xlDown))Select SelectionSort Key1=Range(A1) Order1=xlAscending Header=xlGuess _ OrderCustom=1 MatchCase=False Orientation=xlTopToBottom Else End If Mise en place de la valeur choisie en D2 Sheets(Feuil1)Cells(2 4)Value = MeConstructeurValue End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteModifiableHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Boite de dialogue avec seacutelection multiple dans liste deacuteroulante

Le Userform (DlgChoixMultiple)

Les controcircles

Nom de la ListBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteMultiSelect() DlgChoixMutlipleShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear Proprieacuteteacute Multiselect du controcircle ListeClients mis sur fmMultiSelectExtended ListeClientsMultiSelect = fmMultiSelectExtended End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixMultipleHide j = 1 With ListeClients For i = 0 To ListCount - 1 If Selected(i) = True Then Le reacutesultat est placeacute dans les colonnes D et E de la feuille Feuil1 Cells(j 4) = List(i 0) Cells(j 5) = List(i 1) Selected(i) = False j = j + 1 End If Next End With End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixMultipleHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire

(voir image du Userform au deacutebut de la page)

Boite de dialogue avec liste deacuteroulante agrave 2 colonnes

Le Userform (DlgChoix)

Les controcircles

Nom de la ComboBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Quelques proprieacuteteacutes du controcircle ListeClients

ColumnCount = 2 (Nbre de colonne agrave afficher dans une zone de liste) ColumnWidths = 40 (Largeur de chaque colonne dune zone de liste agrave plusieurs colonnes)

Height = 18 (Hauteur en points dun objet) ListWidth = 190 (Largeur de la liste dun controcircle ComboBox) Width = 78 (largeur en points dun objet)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulante() DlgChoixShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 10: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Nom de la ListBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulanteMultiSelect() DlgChoixMutlipleShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear Proprieacuteteacute Multiselect du controcircle ListeClients mis sur fmMultiSelectExtended ListeClientsMultiSelect = fmMultiSelectExtended End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixMultipleHide j = 1 With ListeClients For i = 0 To ListCount - 1 If Selected(i) = True Then Le reacutesultat est placeacute dans les colonnes D et E de la feuille Feuil1 Cells(j 4) = List(i 0) Cells(j 5) = List(i 1) Selected(i) = False j = j + 1 End If Next End With End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixMultipleHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire

(voir image du Userform au deacutebut de la page)

Boite de dialogue avec liste deacuteroulante agrave 2 colonnes

Le Userform (DlgChoix)

Les controcircles

Nom de la ComboBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Quelques proprieacuteteacutes du controcircle ListeClients

ColumnCount = 2 (Nbre de colonne agrave afficher dans une zone de liste) ColumnWidths = 40 (Largeur de chaque colonne dune zone de liste agrave plusieurs colonnes)

Height = 18 (Hauteur en points dun objet) ListWidth = 190 (Largeur de la liste dun controcircle ComboBox) Width = 78 (largeur en points dun objet)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulante() DlgChoixShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 11: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Boite de dialogue avec liste deacuteroulante agrave 2 colonnes

Le Userform (DlgChoix)

Les controcircles

Nom de la ComboBox = ListeClients Nom du CommandButton OK = OK Nom du CommandButton Annuler = Annuler

Quelques proprieacuteteacutes du controcircle ListeClients

ColumnCount = 2 (Nbre de colonne agrave afficher dans une zone de liste) ColumnWidths = 40 (Largeur de chaque colonne dune zone de liste agrave plusieurs colonnes)

Height = 18 (Hauteur en points dun objet) ListWidth = 190 (Largeur de la liste dun controcircle ComboBox) Width = 78 (largeur en points dun objet)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheListeDeroulante() DlgChoixShow End Sub

Code dinitialisation du formulaire

Private Sub UserForm_Initialize() Les donneacutees proviennent de la feuille Feuil1 et sont dans les colonnes A et B With Sheets(Feuil1)Range(A1) MeListeClientsRowSource = Range(Cells End(xlDown)(1 2))Address(External=True) End With End Sub

Code dactivation du formulaire

Private Sub UserForm_Activate() Effacement des donneacutees de la plage qui reccediloit les items seacutelectionneacutes (colonnes D et E) Range(D1E1 Cells(ListeClientsListCount 4))Clear End Sub

Code des boutons

1 Bouton OK

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 12: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Private Sub OK_Click() DlgChoixHide If ListeClientsListIndex ltgt -1 Then Reacutecupeacuteration du code et du nom du client Sheets(Feuil1)Cells(1 4)Value = ListeClientsColumn(0 ListeClientsListIndex) Sheets(Feuil1)Cells(1 5) = ListeClientsColumn(1 ListeClientsListIndex) End If End Sub

2 Bouton Annuler

Private Sub Annuler_Click() DlgChoixHide End Sub

Le reacutesultat par rapport agrave la seacutelection dans le formulaire (voir image du Userform au deacutebut de la page)

Boite de dialogue combineacutee

Cette boicircte de dialogue permet de mettre agrave jour les deux controcircles de droite

(TextBox et ComboBox) suivant la seacutelection effectueacutee dans le controcircle de

gauche (ListBox) et cela de maniegravere dynamique

Le Userform (ListeDeroulanteCombinee)

Le code

Code lanccedilant louverture du Userform (ListeDeroulanteCombinee)

Sub AfficheListeDeroulanteCombinee() Sheets(Accueil)Activate Range(B2)Value = Range(C2)Value = Range(D2)Value = ApplicationScreenUpdating = False ListeDeroulanteCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 13: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Private Sub UserForm_Activate() Dim Arr() As String Dim I As Integer NbSheets As Integer Dim Liste As Object Suppression des entreacutees de la liste si celle-ci en contient If OngletsListCount gt= 1 Then Dim ElementListe As Integer Dim NbreIt As Integer NbreIt = OngletsListCount - 1 For ElementListe = NbreIt To 0 Step -1 OngletsRemoveItem (ElementListe) Next ElementListe End If Ajout de toutes les entreacutees de la liste NbSheets = WorksheetsCount ReDim Arr(1 To NbSheets) For I = 2 To NbSheets Arr(I) = Worksheets(I)Name ListeDeroulanteCombineeOngletsAddItem Arr(I) Next I OngletsListIndex = 0 End Sub

Code sur leacuteveacutenement Change de la liste deacuteroulante Onglets (Controcircle situeacute agrave gauche)

Private Sub Onglets_Change() Dim OngletSelect As Integer Deacuteterminer la ligne seacutelectionneacutee dans la liste deacuteroulante OngletSelect = ListeDeroulanteCombineeOngletsListIndex + 2 Mise agrave jour TextBox Cateacutegorie (controcircle en haut et agrave droite) ListeDeroulanteCombineeCategorie = Sheets(OngletSelect)Range(C1)Value Mise agrave jour ComboBox Marque (controcircle en bas et agrave droite) Dim DerniereMarque As String Sheets(OngletSelect)Activate DerniereMarque = Range(A1)End(xlDown)Address MarqueRowSource = A1 amp DerniereMarque MarqueListIndex = 0 End Sub

Code des boutons

1 Bouton Valider

Private Sub Valider_Click() ListeDeroulanteCombineeHide Reacutecupeacuteration des index en fonction de la seacutelection IndexOnglet = OngletsListIndex IndexModele = MarqueListIndex Reacutecupeacuteration des valeurs en fonction des index Onglet = OngletsList(IndexOnglet) Modele = MarqueList(IndexModele) Rubrique = CategorieValue

Mise en place des valeurs dans la feuille de calcul Sheets(Accueil)Activate Range(B2)Value = Onglet Range(C2)Value = Rubrique Range(D2)Value = Modele End Sub

2 Bouton Annuler

Private Sub Annuler_Click() ListeDeroulanteCombineeHide End Sub

Les donneacutees utiliseacutees pour remplir la liste deacuteroulante

Onglet Liste Voitures

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 14: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Onglet Liste Motos

Onglet Liste Avions

Un exemple de seacutelection avec le reacutesultat inscrit dans la feuille de calcul

Boite de dialogue combineacutee

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 15: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Cette boicircte de dialogue permet en cochant une des options du controcircle

de gauche (Cateacutegorie) dafficher la liste correspondante dans le

controcircle de droite (Liste avec Noms et Preacutenoms)

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (ListeCombinee)

Sub AfficheListeCombinee() ListeCombineeShow End Sub

Code douverture du formulaire par leacuteveacutenement Activate

Private Sub UserForm_Activate() Permet de cocher le bouton radio 1 agrave louverture du formulaire MeOptionButton1Value = True End Sub

Code sur leacuteveacutenement Click des boutons doption de la zone Cateacutegorie

(Controcircle situeacute agrave gauche)

Private Sub OptionButton1_Click() LastInputRow = Cells(1 1)End(xlDown)Row ListBox1RowSource = EffectifA1 A amp LastInputRow MyCategorie = Deacutebutants MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton2_Click() LastInputRow = Cells(1 2)End(xlDown)Row ListBox1RowSource = EffectifB1 B amp LastInputRow MyCategorie = Poussins MeListBox1ListIndex = 0 Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Private Sub OptionButton3_Click() LastInputRow = Cells(1 3)End(xlDown)Row ListBox1RowSource = EffectifC1 C amp LastInputRow MyCategorie = Benjamins MeListBox1ListIndex = 0

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 16: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Mise agrave jour libelleacute liste deacuteroulante With ListeCombinee Label1Caption = Liste des amp MyCategorie amp (Nom et Preacutenom) End With End Sub

Code des boutons

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MySelection = MeListBox1List(ListBox1ListIndex) MsgBox Vous avez choisi le joueur amp MySelection amp amp vbCr amp _ Il appartient agrave la cateacutegorie des amp MyCategorie amp Unload Me End Sub

2 Bouton Annuler

Private Sub Annuler_Click() MeHide Unload Me End Sub

Boite de dialogue avec 2 ListBox synchroniseacutees

Sur une ideacutee de Ole P Erlandsen

Cette boicircte de dialogue permet en seacutelectionnant un eacuteleacutement dans la liste de gauche

dafficher les eacuteleacutements correspondants dans la liste de droite

Le Userform (ListeCombinee)

Le code

Code lanccedilant louverture du Userform (DoubleListBox)

Sub AfficheListBox() Load DoubleListBox DoubleListBoxShow Unload DoubleListBox End Sub

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 17: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Code douverture du formulaire par leacuteveacutenement Initialize

Private Sub UserForm_Initialize() La mise agrave jour des items dans ListBox1 mettra agrave jour les items dans la ListBox2 With Me UpdateListBox ListBox1 -1 End With End Sub

Code sur leacuteveacutenement Change de la ListBox1 (Controcircle situeacute agrave gauche)

Private Sub ListBox1_Change() Mise agrave jour des items dans la ListBox2 UpdateListBox MeListBox2 MeListBox1ListIndex End Sub

Private Sub UpdateListBox(Parametres As MSFormsListBox IndexValue As Integer) Dim LastInputRow As Integer ColumnIndex As Integer InputRange As Range Les donneacutees commencent agrave la ligne 3 Const FirstInputRow As Integer = 3 Deacutetermine depuis quelle colonne on prend la liste des items ColumnIndex = IndexValue + 2 Deacutetermine la derniegravere ligne de la colonne seacutelectionneacutee et la plage correspondante LastInputRow = Cells(FirstInputRow ColumnIndex)End(xlDown)Row Set InputRange = ActiveSheetRange(Cells(FirstInputRow ColumnIndex) Cells(LastInputRow ColumnIndex)) With Parametres ColumnHeads = True Affiche les en-tecirctes de colonne RowSource = InputRangeAddress Speacutecifie la source de donneacutees ListIndex = 0 Seacutelectionne le premier item End With Set InputRange = Nothing End Sub

Code du bouton valider

1 Bouton Valider

Private Sub CmdValider_Click() MeHide MsgBox Dans la cateacutegorie amp MeListBox1List(MeListBox1ListIndex) amp Chr(13) amp Chr(13) amp _ Vous avez choisi amp MeListBox2List(MeListBox2ListIndex) vbInformation Reacutesultat de votre choix End Sub

La feuille de donneacutees

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 18: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Boicircte de dialogue avec un controcircle TabStrip (controcircle Onglet)

Quelques infos agrave propos du Controcircle TabStrip

Un controcircle TabStrip est un controcircle contenant une collection dun

ou de plusieurs onglets

Dans les controcircles TabStrip ceux-ci sont indeacutependants des pages

En reacutealiteacute un clic sur un onglet naffiche pas de nouvelle page

Pour les controcircles TabStrip la proprieacuteteacute Value permet de deacuteterminer

ou de deacutefinir quel onglet est actif

Cet exemple permet en cliquant sur lun des onglets davoir instantaneacutement les chiffres correspondants agrave lactiviteacute indiqueacutee sur longlet

Le Userform (Avec 3 onglets)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 19: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheTabStrip() UserForm1Show End Sub

Code douverture du formulaire

Private Sub UserForm_Activate() MeTabStrip1Value = 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I End Sub

Code sur leacuteveacutenement Change

Private Sub TabStrip1_Change() Select Case TabStrip1Value Case 0 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 2)Value Next I Case 1 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 3)Value Next I Case 2 For I = 1 To 5 MeControls(TextBox amp I)Value = Sheets(Reacutesultats)Cells(I + 1 4)Value Next I End Select End Sub

Code du bouton Fermer

Bouton Fermer

Private Sub CmdFermer_Click() MeHide End Sub

Les donneacutees de la feuille Reacutesultats utiliseacutees pour remplir le

UserForm

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 20: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Les controcircles courants

Exemples dutilisation de InputBox

Page mise agrave jour le 19032003

InputBox peut ecirctre utiliseacutee soit comme fonction soit comme meacutethode

La fonction Inputbox permet dafficher une boicircte de dialogue contenant une zone de

texte leacutegendeacutee invitant lutilisateur agrave y saisir linformation attendue Linformation saisie

est renvoyeacutee sous forme de chaicircne de caractegraveres et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

Lobjet Application dExcel possegravede une meacutethode InputBox que lon peut substituer agrave la

fonction InputBox de Visual Basic

La meacutethode Inputbox se preacutesente comme la fonction InputBox mais offre une

possibiliteacute tregraves

inteacuteressante elle permet de speacutecifier le type de donneacutees qui sera renvoyeacutee (numeacuterique

plage)

Saisie dinformation via une InputBox (fonction)

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Saisie dinformation via une InputBox (fonction)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue Linformation saisie est renvoyeacutee sous forme

de chaicircne de caractegraveres et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxFonction() Dim Inscription As String Inscription = InputBox(Nom de ladheacuterent Nouveau membre) Si lutilisateur na saisie aucune donneacutee et quil clique sur OK ou si lutlisateur clique sur Annuler on quitte la proceacutedure If Inscription = Then MsgBox Aucune donneacutee na eacuteteacute saisie Exit Sub Sinon la donneacutee saisie est afficheacutee Else MsgBox Inscription End If

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 21: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

End Sub

Saisie dinformation (valeur numeacuterique) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme numeacuterique (type=1) Linformation

saisie est renvoyeacutee sous forme de nombre et stockeacutee dans une variable afin de

pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim Recette As Integer Recette = ApplicationInputBox(Recette effectueacutee Saisie de la recette Type=1) Si lutlisateur a cliqueacute sur Annuler If Recette = False Then Exit Sub sinon la donneacutee saise est afficheacutee MsgBox La recette est de amp Recette End Sub

Saisie dinformation (plage de cellules) via une InputBox (meacutethode)

Cette boite de dialogue avec une zone de texte leacutegendeacutee invite lutilisateur

agrave y saisir linformation attendue sous forme de seacutelection de plage (type=8)

Linformation saisie est renvoyeacutee sous forme de plage et stockeacutee dans une variable afin de pouvoir ecirctre ensuite exploiteacutee par le programme

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue InputBox

Sub UtilisationDeInputboxMethode() Dim MaPlage As Range On Error Resume Next Set MaPlage = ApplicationInputBox(prompt=Seacutelectionnez une plage de cellules _ Title=Seacutelection dune plage Left=5 Top=5 Type=8) Si lutlisateur a cliqueacute sur le bouton Annuler If ErrNumber = 424 Then MsgBox Vous avez choisi dannuler

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 22: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

End Else sinon la plage seacutelectionneacutee va ecirctre afficheacutee MsgBox La plage seacutelectionneacutee est amp MaPlageAddress End If End Sub

Pour plus dinformations consultez laide sur InputBox

Exemples de la fonction MsgBox

Page mise agrave jour le 02112000

Vous trouverez dans cette rubrique des exemples de la fonction MsgBox La fonction

MsgBox permet dafficher une boicircte de dialogue preacutesentant un message et des boutons

de commande afin dafficher une information agrave lattention de lutilisateur ou dobtenir une reacuteponse agrave une question qui orientera lexeacutecution du programme

Message dinformation via une MsgBox

Message dinformation via une MsgBox avec choix de laction agrave effectuer (2 boutons)

Message dinformation via une MsgBox avec choix de laction agrave effectuer (3 boutons)

Message dinformation via une MsgBox

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur le bouton pour valider la lecture de ce message

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageInformation() Affiche un message dinformation Msg = Votre fichier a eacuteteacute sauvegardeacute Title = Deacutemonstration de MsgBox - E Renaud 102000 Style = vbOKOnly + vbInformation Reponse = MsgBox(Msg Style Title) End Sub

Message dinformation via une MsgBox avec choix de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui

indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 23: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub RecupInfoMessage() Dim Msg Style Title Response Deacutefinit le message Msg = Souhaitez-vous continuer Deacutefinit les boutons Style = vbYesNo + vbQuestion Deacutefinit le titre Title = Deacutemonstration de MsgBox - E Renaud 12000 Affiche le message Response = MsgBox(Msg Style Title) If Response = vbYes Then Lutilisateur a choisi Oui MyString = Oui Effectue une action Else Lutilisateur a choisi Non MyString = Non Effectue une action End If End Sub

Message dinformation via une MsgBox avec choix

de laction agrave effectuer

Cette boicircte de dialogue affiche un message attend que lutilisateur

clique sur un bouton puis renvoie une valeur de type Integer qui indique le bouton choisi par lutilisateur

La boicircte de dialogue

Le code

Code lanccedilant louveture de la boicircte de dialogue MsgBox

Sub MessageAvecReponseOuAnnulation() Affiche un message dinformation avec test sur le bouton seacutelectionneacute Msg = Deacutemonstration avec 3 boutons Title = Exemple de boicircte de message Style = vbYesNoCancel + vbQuestion Reponse = MsgBox(Msg Style Title) Si le bouton Annuler a eacuteteacute choisi on quitte la proceacutedure If Reponse = vbCancel Then Exit Sub sinon on teste lequel du bouton Oui ou Non a eacuteteacute choisi If Reponse = vbYes Then MsgBox Vous avez seacutelectionneacute Oui Else MsgBox Vous avez seacutelectionneacute Annuler End If End Sub

Pour plus dinformations consultez laide sur MsgBox

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 24: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Controcircles avanceacutes

Le controcircle Calendar (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut

et fin pour les utiliser dans votre application

Exemple trouveacute dans livre Excel 2000 amp Visual Basic pour Applications 6 disponible chez Amazonfr

Ajout du controcircle Calendar

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Calendar Control 80

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (fmContratDates)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 25: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheCalendar() fmContratDatesShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() cboDateAValiderAddItem (Date de deacutebut) cboDateAValiderAddItem (Date de fin) cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

Code lieacute au choix des dates sur le controcircle Calendar

Private Sub Calendrier_Click() Choix dune date sur le calendrier If cboDateAValiderListIndex = 0 Then DateDebutValue = CalendrierValue cboDateAValiderListIndex = 1 Else DateFinValue = CalendrierValue End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() Veacuterification de la validiteacute des informations If DateDebutValue = Then

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 26: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

MsgBox Vous devez speacutecifier une date de deacutebut vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateFinValue = Then MsgBox Vous devez speacutecifier une date de fin vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt= 0 Then MsgBox Vous devez speacutecifier une date de deacutebut anteacuterieure agrave la date de fin _ vbOKOnly + vbCritical Contrat dauteur Exit Sub ElseIf DateValue(DateFin) - DateValue(DateDebut) lt 40 Then Dim Continuer As Integer Continuer = MsgBox(Vous avez indiqueacute une date de deacutebut agrave seulement _ amp DateValue(DateFin) - DateValue(DateDebut) amp jours de la date de fin _ Valider cette date vbYesNo + vbQuestion Valider la date de deacutebut ) If Continuer = vbNo Then Exit Sub End If fmContratDatesHide Affichage des dates seacutelectionneacutees MsgBox ( Les dates de Deacutebut et Fin sont amp DateDebutValue amp et amp DateFinValue) Mise agrave jour des paramegravetres DateDebutValue = DateFinValue = cboDateAValiderListIndex = 0 CalendrierValue = Date CalendrierSetFocus End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() Dim Rep As Byte Rep = MsgBox(Etes-vous sucircr de vouloir fermer lapplication en cours _ vbYesNo + vbQuestion Annuler lapplication en cours ) If Rep = vbNo Then Exit Sub End If MeHide End End Sub

3 Bouton Retour (cmdRetour)

Private Sub CmdRetour_Click() MsgBox Vous allez fermer lapplication MeHide End Sub

Le controcircle ComboBox

Allie les caracteacuteristiques dun controcircle ListBox et dun controcircle TextBox

Lutilisateur peut entrer une nouvelle valeur comme dans un controcircle TextBox

ou bien seacutelectionner une valeur existante comme dans un controcircle ListBox

La liste dun controcircle ComboBox se compose de lignes de donneacutees La proprieacuteteacute par deacutefaut dun controcircle ComboBox est la proprieacuteteacute Value

Le principe de fonctionnement de ce controcircle se deacutecompose comme suit

1 - Remplir le controcircle ComboBox avec des donneacutees

2 - Choisir une de ces donneacutees en la seacutelectionnant

3 - Reacutecupeacuterer la donneacutee seacutelectionneacutee agrave la fermeture du formulaire

Remplir le controcircle Combobox avec des donneacutees

Exemple Afficher une liste de Domaines viticoles

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 27: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Je vous donne 4 meacutethodes pour remplir cette ComboBox (en fonction de votre besoin)

La proprieacuteteacute (name) du controcircle ComboBox est cboComboBox

Meacutethode 1 Les donneacutees sont dans une feuille de calcul (Feuil1)

Private Sub UserForm_Initialize() MecboComboBoxRowSource = Feuil1A1A amp Sheets(Feuil1)Cells(1 1)End(xlDown)Row End Sub

Meacutethode 2 Les donneacutees sont figeacutees et vous les ajoutez gracircce agrave la meacutethode

AddItem

Private Sub UserForm_Initialize() With MecboComboBox cboComboBoxAddItem Domaine Alexis Rouge cboComboBoxAddItem Domaine du Grand Cregraves Blanc cboComboBoxAddItem Domaine du Grand Cregraves Muscat cboComboBoxAddItem Domaine du Grand Cregraves Roseacute cboComboBoxAddItem Domaine du Grand Cregraves Rouge End With End Sub

Meacutethode 3 Les donneacutees correspondent agrave la liste des mois (Janvier Feacutevrier

Deacutecembre) On va utiliser la meacutethode AddItem avec une variable (i)

Private Sub UserForm_Initialize() Dim Mois(1 To 12) As String Dim i As Integer Creacuteation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format(DateSerial(1 i 1) mmmm) MecboComboBoxAddItem Mois(i) Next i End Sub

Meacutethode 4 Les donneacutees sont figeacutees et vous les ajouter gracircce _

agrave la fonction VBAArray(arglist)

Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim stDeptList() As String Dim i As Integer vaDepartement = VBAArray(Ain Aisne AllierAlpes-de-Hte-Provence _ Alpes-Hautes Alpes-Maritimes Ardennes) ReDim stDeptList (0 To UBound(vaDepartement)) For i = 0 To UBound(vaDepartement) stDeptList(i) = vaDepartement(i) Next i cboComboboxList = stDeptList End Sub

Seacutelectionner une donneacutees dans la liste

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 28: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Il suffit simplement de seacutelectionner avec la souris la donneacutee deacutesireacutee

Reacutecupeacuterer litem seacutelectionneacute

Private Sub cmdOK_Click() MsgBox Litem seacutelectionneacute est amp cboComboBoxValue vbInformation Unload Me End Sub

Reacutecupeacuterer une nouvelle valeur saisie

Il est possible dans le cas ougrave les donneacutees sont issues dune feuille Excel dinscrire cette nouvelle valeur dans la feuille Excel Lorsque lon ajoute une nouvelle donneacutee celle-ci se trouve en position ListIndex = -1 On utilise pour cela un test sur la proprieacuteteacute ListIndex En reacutegle geacutenegraverale cette proprieacuteteacute ListIndex agrave la valeur -1 agrave louveture du formulaire Si on seacutelectionne la premiegravere donneacutee de la liste la valeur ListIndex est eacutegale agrave 0 et ainsi de suite

Private Sub OK_Click() MeHide If MecboComboBoxListIndex = -1 Then _ Sheets(Feuil1)Cells(1 1)End(xlDown)Offset(1 0)Value = MecboComboboxValue End Sub

Le controcircle RefEdit

Ce controcircle placeacute dans un formulaire affiche ladresse dune plage de cellules

que vous avez entreacutee ou seacutelectionneacutee dans une feuille de calcul

Pour seacutelectionner une plage cliquez sur le bouton dans le controcircle pour reacuteduire

le formulaire utilisateur seacutelectionnez la plage puis cliquez de nouveau sur le

bouton dans le controcircle pour deacutevelopper le formulaire utilisateur

Exemple dutilisation du controcircle RefEdit

Effectuer une opeacuteration arithmeacutetique (+ - ou x) sur une plage de cellules (Ex Conversion FrsEuros majorer un prix appliquer une remise)

Principe dutilisation du controcircle RefEdit

Etape 1 Cliquez sur le trait horizontal du controcircle

Etape 2 Affichage dune boicircte de seacutelection

Etape 3 Seacutelectionnez avec la souris la plage deacutesireacutee

Etape 4 Cliquez sur la flegraveche rouge du controcircle pour valider votre seacutelection

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 29: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Mise en oeuvre du controcircle RefEdit

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez RefEditCtrl

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle

dans la boicircte agrave outils

Ajout du controcircle RefEdit

La boicircte agrave outils

Le Userform (SelectOperation)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 30: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Le code

Code lanccedilant louverture de la boicircte de dialogue

Sub AfficheRefEdit() SelectOperationShow End Sub

Code douverture du formulaire

Private Sub UserForm_Initialize() Affiche la seacutelection en cours RefEdit1Text = ActiveWindowRangeSelectionAddress Rend le bouton Addition actif par deacutefaut Frame1OptionAdditionValue = True End Sub

Code des boutons

1 Bouton Valider (CmdValider)

Private Sub CmdValider_Click() Teste si une valeur a eacuteteacute saisie dans la TextBox (Opeacuterande) On Error Resume Next If TextBox1Value = Then MsgBox Vous devez saisir une valeur dopeacuterande RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Set PlageSelect = Range(RefEdit1Text) MyOperande = TextBox1Value Teste la seacutelelection effectueacutee est correct If Err ltgt 0 Then MsgBox La plage seacutelectionneacutee est invalide RefEdit1SetFocus On Error GoTo 0 Exit Sub End If Effectue lopeacuteration choisie sur la plage de cellules seacutelectionneacutees For Each Cell In PlageSelect If OptionAdditionValue = True Then CellValue = CellValue + MyOperande If OptionSoustractionValue = True Then CellValue = CellValue - MyOperande If OptionMultiplicationValue = True Then CellValue = CellValue MyOperande If OptionDivisionValue = True Then CellValue = CellValue MyOperande Next Cell SelectOperationHide Unload SelectOperation End Sub

2 Bouton Annuler (CmdAnnuler)

Private Sub CmdAnnuler_Click() SelectOperationHide Unload SelectOperation

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 31: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

End Sub

Le controcircle TextBox (Zone de texte)

Ce controcircle placeacute dans un Userform permet la saisie de donneacutees

Ces donneacutees saisies peuvent parfois ecirctre erronneacutees (erreur de frappe texte agrave la

place de

nombre date non conforme etc )

Pour cela il peut ecirctre inteacuteressant de controcircler soit lors de la validation par OK ou

lors de la

sortie du controcircle si les donneacutees saisies sont conformes par rapport agrave la fonction du controcircle

Convention deacutecriture

Le Userform est nommeacute UserForm1

Le controcircle TextBox est nommeacute TextBox1

Le bouton OK est nommeacute CmdOK

Exemples de tests sur une TextBox

Sassurer quil y a eu une saisie dans la TextBox

Sassurer que la saisie dans la TextBox est de type numeacuterique (nombre)

Le controcircle ProgressBar version 60

Ce controcircle permet dafficher par exemple la progression dune mise agrave

jour de cellules (ex multiplier une plage par un coeumlfficient)

Exemple trouveacute sur le site de Ole P Erlandsen

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft ProgressBar Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

Ajout du controcircle ProgressBar Control

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 32: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

La boicircte agrave outils

Le Userform (frmProgressBar1)

Le code

Code lanccedilant lindicateur de progression

Sub StartProcessing1() Displays a progress bar while a macro runs requires a reference to MSCOMCTRLOCX Dim lngTotal As Long lngI As Long Initiate ProgressBar Load frmProgressBar With frmProgressBar ProgressBarScrolling = ccScrollingStandard or ccScrollingSmooth Show set the UserForms ShowModal property to false before running or Show False End With UpdateProgressBar 0 Processing set initial progress status start the process lngTotal = 2000 For lngI = 1 To lngTotal If lngI Mod 50 = 0 Then Update the ProgressBar for every 50th loop UpdateProgressBar lngI lngTotal 100 Processing amp Format _ (lngI lngTotal 0) amp End If Do something place your code here Range(D1)Formula = Format(Time hhmmss) Next lngI Range(D1)ClearContents

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 33: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Clean up frmProgressBarHide Unload frmProgressBar End Sub

Code lieacute agrave la macro UpdateProgressBar

Private Sub UpdateProgressBar(NewValue As Single Optional NewCaption As String) Updates the progressbar dialog With frmProgressBar If Not IsMissing(NewCaption) Then Caption = NewCaption ProgressBarValue = NewValue If NewValue = 0 Then Repaint End With End Sub

Le controcircle DTPicker (calendrier)

Ce controcircle permet gracircce agrave un calendrier de saisir des dates de deacutebut et des dates

de fin

de faccedilon simple et sans erreur possible pour les utiliser ensuite dans votre

application Cet exemple a eacuteteacute reacutealiseacute sous Excel 2000

Aspect du controcircle

Ajout du controcircle DTPicker

1 - Activer un UserForm dans le Visual Basic Editor

2 - Faites un clic droit sur la boicircte agrave outils et seacutelectionnez Controcircles

suppleacutementaires

3 - Dans la liste deacuteroulante seacutelectionnez Microsoft Date and Time Picker Control

version 60

4 - Cliquez sur OK pour fermer la boicircte de dialogue et ajoutez le controcircle dans la boicircte agrave outils

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 34: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

La boicircte agrave outils

Le Userform (frmConges)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 35: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Le code

Code lanccedilant louverture du formulaire

Sub AfficheConges() frmCongesShow End Sub

Codes douverture du formulaire

Private Sub UserForm_Initialize() Deacutefinir buteacutee mini pour controcircle Date deacutebut (DTPicker1) MeDTPicker1MinDate = Now - 60 Deacutefinir buteacutee maxi pour controcircle Date fin (DTPicker2) MeDTPicker2MaxDate = Now + 365 End Sub

Private Sub UserForm_Activate() Remplissage des 2 listes deacuteroulantes (Nom agent et type de congeacutes) MecboAgentsRowSource = CongeacutesB7B21 MecboCongesRowSource = CongeacutesB24B31 Activer le premier enregistrement de chaque liste deacuteroulante MecboAgentsListIndex = 0 MecboCongesListIndex = 0 Deacutefinir la date afficheacutee par deacutefaut dans chaque controcircle DTPicker MeDTPicker1Value = Now MeDTPicker2Value = Now End Sub

Code lieacute agrave leacutevenement Change sur le controcircle DTPicker2

Private Sub DTPicker2_Change() Reacutecupeacuteration des dates seacutelectionneacutees MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker2SetFocus End If End Sub

Code des boutons

1 Bouton Valider (cmdValider)

Private Sub CmdValider_Click() MyDateDebut = DTPicker1Value MyDateFin = DTPicker2Value Dans le cas ougrave le choix est effectueacute sur le DTPicker1 If MyDateFin lt= MyDateDebut Then MsgBox La date de fin ne peut ecirctre infeacuterieure agrave la date de deacutebut DTPicker1SetFocus Else Unload Me Mise en place des donneacutees dans la feuille BaseCongeacutes Sheets(BaseCongeacutes)Cells(65536 1)End(xlUp)Offset(1 0)Value = MecboAgentsList _ (MecboAgentsListIndex) Sheets(BaseCongeacutes)Cells(65536 2)End(xlUp)Offset(1 0)Value = MecboCongesList _ (MecboCongesListIndex) Sheets(BaseCongeacutes)Cells(65536 3)End(xlUp)Offset(1 0)Value = Format(MyDateDebut mmddyyyy) Sheets(BaseCongeacutes)Cells(65536 4)End(xlUp)Offset(1 0)Value = Format(MyDateFin mmddyyyy) End If End Sub

2 Bouton Annuler (cmdAnnuler)

Private Sub CmdAnnuler_Click() MeHide End Sub

Quelques infos sur les UserForms

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 36: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Dans cette rubrique vous trouverez des infos pour la gestion des UserForms

Retour au menu Controcircles divers

Empecirccher le deacuteplacement dun Userform

Mettre hors fonction la croix (X) de fermeture du UserForm

Minimiser un formulaire (Excel 2000 uniquement)

Ajout dune image sur un bouton de formulaire

Empecirccher le deacuteplacement dun Userform et non affichage de la croix de fermeture

[ Exemple proposeacute par Laurent Longre ]

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If exLong And ampH880000 Then SetWindowLongA hWnd -16 exLong And ampHFF77FFFF MeHide MeShow End If End Sub

Mettre hors fonction la croix (X) de fermeture du UserForm

Private Sub UserForm_QueryClose(Cancel As Integer CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox Vous ne pouvez pas utiliser ce bouton de fermeture Cancel = True End If End Sub

Minimiser un UserForm

[ Exemple proposeacute par Laurent Longre ]

Mettre la proprieacuteteacute ShowModal du UserForm sur False (cette proprieacuteteacute nexiste pas sous Excel 97)

Deacutefintions

1 - Lorsquun objet UserForm est modal (ShowModal=True) lutilisateur doit fournir des informations

ou fermer lobjet UserForm pour pouvoir utiliser toute autre partie de lapplication 2 - Lorsquun objet UserForm nest pas modal (ShowModal=False) lutilisateur peut afficher dautres feuilles

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 37: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

ou fenecirctres sans fermer cet objet

Le code qui suit devra ecirctre dans le module de code du UserForm

Private Declare Function FindWindowA Lib User32 _ (ByVal lpClassName As String ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib User32 _ (ByVal hWnd As Long ByVal nIndex As Long _ ByVal dwNewLong As Long) As Long

Private Sub UserForm_Activate() Dim hWnd As Long exLong As Long hWnd = FindWindowA(vbNullString MeCaption) exLong = GetWindowLongA(hWnd -16) If (exLong And ampH20000) = 0 Then SetWindowLongA hWnd -16 exLong Or ampH20000 MeHide MeShow End If End Sub

Ajouter une image agrave un bouton de formulaire

Pour ajouter une image agrave un bouton de formulaire il faut posseacuteder une image de type Gif par exemple avec une taille denviron 26x20 comme celles ci-dessous

Vous creacuteez votre bouton normalement et ensuite vous allez dans les proprieacuteteacutes de ce bouton

1 - Seacutelectionner la proprieacuteteacute Picture et cliquez sur le bouton avec 3 points Vous seacutelectionnez votre image 2 - Seacutelectionner la proprieacuteteacute PicturePosition et choisissez loption 2 - fmPicturepositionLeftBottom (Cest celle qui me parait ecirctre la mieux adapteacutee)

Remplir une combobox ou listbox

Depuis une sheet

Remplir une ComboBox ou Listbox depuis une feuille de calcul Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1A amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 38: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Depuis une sheet (2 colonnes)

Private Sub UserForm_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Feuil1A1B amp Sheets( Feuil1 )Cells( 1 1 )End(xlDown)Row End With End Sub

Avec une autre syntaxe Private Sub UserForm1_Initialize() With Sheets( Feuil1 )Range( A1 ) MeComboBox1RowSource = Range(Cells End(xlDown)( 1 2 ))Address(External= True ) End With End Sub

Avec la meacutethode Additem

Ajout ditem avec la meacutethode AddItem pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() With MeComboBox1 ComboBox1AddItem Domaine Alexis Rouge ComboBox1AddItem Domaine du Grand Cregraves Blanc ComboBox1AddItem Domaine du Grand Cregraves Muscat ComboBox1AddItem Domaine du Grand Cregraves Roseacute ComboBox1AddItem Domaine du Grand Cregraves Rouge End With End Sub

Avec la liste des onglets Ajout de la liste des onglets du classeur pour remplir une ComboBox ou Listbox Public Sub UserForm_Initialize() For Each c In ActiveWorkbookSheets ComboBox1AddItem cName Next End Sub

Avec les noms des mois Ajout ditems correspondant agrave des mois pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Dim Mois( 1 To 12 ) As String Dim i As Integer Creation dun tableau des noms de mois For i = 1 To 12 Mois(i) = Format ( DateSerial ( 1 i 1 ) mmmm ) MeComboBox1AddItem Mois(i) Next i End Sub

Avec une plage nommeacutee Utiliser une une plage nommeacutee pour

remplir une ComboBox ou Listbox

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 39: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

La liste est deacutefinie dans le Userform par son nom entreacute agrave laide de la commande InsertionNomDeacutefinir avec la formule suivante NomClient=DECALER(Codes$A$1NBVAL(Codes$A$A)) ou Codes correspond au nom de longlet du classeur et

Nomclient eacutetant le nom de la plage de donneacutees Private Sub UserForm_Initialize() Activation du classeur WorkBookxls Workbooks( WorkBookxls )Activate ComboBox1RowSource = CodesNomClient End Sub

Avec une boucle et additem Ajout ditems correspondant agrave des anneacutees pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() ReDim Annee( 1 To 12 ) For i = 1 To 12 Annee(i) = 1998 + (i) MeComboBox1AddItem Annee(i) Next End Sub

Avec un fichier texte Ajout ditem depuis un fichier texte pour remplir une ComboBox ou Listbox Private Sub UserForm_Initialize() Ouvre le fichier en lecture Open CExcelDonneestxt For Input As 1 Do While Not EOF ( 1 ) Lit les donneacutees Input 1 NomClient Ajoute les donneacutees dans la ComboBox ou Listbox MeComboBox1AddItem NomClient Loop Close 1 End Sub

Avec la fonction array (tableau) Private Sub UserForm_Initialize() Dim vaDepartment As Variant Dim vaDeptCode As Variant Dim stDeptList() As String Dim i As Integer Liste des deacutepartements vaDepartment = VBAArray( Ain Aisne Allier Alpes (Hte Prov) Alpes (Hautes) Alpes (Maritimes) _ Ardegraveche Ardennes ) Code des deacutepartements vaDeptCode = VBAArray( 01 02 03 04 05 06 07 08 ) ReDim stDeptList( 0 To UBound (vaDepartment) 0 To 1 ) Boucle pour mise en place des valeurs For i = 0 To UBound (vaDepartment) stDeptList(i 0 ) = vaDeptCode(i) stDeptList(i 1 ) = vaDepartment(i)

Next i ComboBox1List = stDeptList End Sub Autre variante possible Private Sub UserForm1_Initialize() Dim TabMonnaies( 4 2 ) ComboBox1ColumnCount = 2 Nom des monnaies proposeacutees TabMonnaies( 0 0 ) = Franc

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 40: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

TabMonnaies( 1 0 ) = Euro TabMonnaies( 2 0 ) = Dollar TabMonnaies( 3 0 ) = Livre Symboles des monnaies

TabMonnaies( 0 1 ) = F TabMonnaies( 1 1 ) = euro TabMonnaies( 2 1 ) = $ TabMonnaies( 3 1 ) = pound ComboBox1List() = TabMonnaies End Sub

Avec les fichiers XLS drsquoun reacutepertoire Lister les fichiers dun reacutepertoire donneacute et les afficher dans une ComboBox ou Listbox Seul le nom du fichier sera afficheacute (Function ShortFilename) Private Sub UserForm_Initialize() Dim F Dim LongFilename As String With ApplicationFileSearch NewSearch LookIn = CExcelTraitement des deacutechets Execute On Error Resume Next For Each F In FoundFiles LongFilename = F Namefile = ShortFilename(LongFilename) MeComboBox1AddItem Namefile Next F End With End Sub

Boucle sur des controcircles

Efface le contenu des textbox Met agrave blanc les diffeacuterentes TextBox contenues dans le formulaire Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 CtrlValue = End If Next Ctrl End Sub

Exporter les donneacutees des textbox Exporte les valeurs des diffeacuterentes TextBox dans les cellules A1 A2 A3 etc lors de la validation par le bouton OK Private Sub cmdOK_Click() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 41: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Cells(i 1 ) = Ctrl End If Next Ctrl End Sub

Remplir les textbox agrave lrsquoouverture Remplit les controcircles TextBox du formulaire

avec les valeurs contenues dans les cellules A1 A2 etc lors de louverture du formulaire Private Sub UserForm_Initialize() Dim i As Integer For Each Ctrl In MeControls If TypeOf Ctrl Is MSFormsTextBox Then i = i + 1 Controls( TextBox amp i)Value = Cells(i 1 )Value End If Next Ctrl End Sub

Initialisation de checkbox Permet via un bouton placeacute sur le formulaire de reacuteinitialiser les controcircles Checkbox (Mise agrave False) Private Sub CmdInitCheckBox_Click() Dim Ctrl As MSFormsControl Remise agrave False des cases agrave cocher For Each Ctrl In UserForm1Controls If TypeOf Ctrl Is MSFormsCheckBox Then CtrlValue = False Next Ctrl End Sub

Les feuilles Excel (Worksheets) Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples concernant des programmes

sappliquant aux feuilles de calcul

Comparer deux colonnes

Effectuer un calcul sur une plage (Ex Multiplier par 2 les cellules

de la plage)

Effectuer une recopie increacutementeacutee

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 42: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Introduire une variable dans une formule SOMME (Ex ladresse dune cellule)

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Recherche du nombre doccurence

Rechercher la derniegravere cellule dune plage

Recopier une plage variable vers une autre feuille du classeur

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Reacutecupeacuterer la somme dune colonne dans une variable

Reacutecupeacuterer le nombre de colonnes

Reacutecupeacuterer le nombre de lignes

Reacutecupeacuterer la somme du produit de 2 colonnes (Somme des N (AB))

Reacutepertoire et nom de fichier dans pied de page

Supprimer les doublons dans une colonne

Supprimer les lignes vides dune plage

Supprimer un nom dans une feuille de calcul

Supprimer tous les noms dans une feuille de calcul

Supprimer les noms avec un joker dans une feuille de calcul

Supprimer les lignes contenant du texte

Utiliser des macro-commandes dans une feuille proteacutegeacutee

Comparer deux colonnes

Permet dajouter dans la colonne 1 les valeurs qui seraient dans la colonne 2 et pas dans la colonne 1 Sub CompareTwoColonnes() Dim Cell As Range Plage As Range I As Long Set Plage = Range(A1 [A1]End(xlDown)) I = PlageCount ApplicationScreenUpdating = False For Each Cell In Range(B1 [B1]End(xlDown)) If PlageFind(Cell Plage(1) xlValues xlWhole) Is Nothing Then I = I + 1 Cells(I 1) = Cell End If Next Cell End Sub

Effectuer un calcul sur une plage

Permet de multiplier lensemble dune plage par une valeur (2 dans lexemple) Sub MultiplieParDeux() Utilisation dun tableau intermeacutediaire Dim Tabl Dim I As Integer J As Integer Tabl = Range(A1C1000)Value For I = 1 To 1000 For J = 1 To 3 Tabl(I J) = Tabl(I J) 2 Next J Next I ApplicationScreenUpdating = False Range(A1C1000)Value = Tabl End Sub

Effectuer une recopie increacutementeacutee

Permet deffectuer une recopie increacutementeacutee agrave partir de A1 et A2 Sub RecopieIncrementee() Set PlageSource = Worksheets(Feuil1)Range(A1A2) Effectue une recopie increacutementeacutee de A1 agrave A20 Set PlageARemplir = Worksheets(Feuil1)Range(A1A20)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 43: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

PlageSourceAutoFill Destination=PlageARemplir End Sub

Inseacuterer une ligne vide toutes les 2 lignes (ou plus)

Permet dinseacuterer dans un tableau une ligne vide toutes les deux lignes (ou plus) Sub MacroInsertUneLigneSurDeux() Dim Line As Integer Range(A2)Select Line = 1 Recommence Line = Line + 2 Rows(Line)Select SelectionInsert Shift=xlDown If Line lt ActiveSheetUsedRangeRowsCount Then GoTo Recommence End If End Sub

Introduire une variable dans une formule SOMME (Ex Un Ndeg de ligne)

Sub VariableSomme() La colonne A est la colonne ougrave lon doit effectuer une somme Se placer sur la premiegravere ligne vide de la colonne pour poser la formule Somme Range(A1)End(xlDown)Offset(1 0)Select Reacutecupeacuteration du nombre de lignes agrave comptabiliser dans la formule MonNoDeLigne = -(ActiveCellRow) + 1 ActiveCellFormulaR1C1 = =SUM(R[ amp MonNoDeLigne amp ]CR[-1]C) End Sub

Introduire une variable dans une formule SOMME (Ex Ladresse dune cellule)

Sub VariableAdressDansSomme() Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range(A1)End _ (xlDown)Address amp ) End Sub

Mettre en eacutevidence les cellules reacutepondant agrave un critegravere

Ce programme va seacutelectionner toutes les cellules correspondant agrave la valeur contenue dans D2 Sub SelectCellulesValeurDeterminee() LaValeur = Range(D2)Value Range(A1)Select For Each cll In ActiveCellCurrentRegion If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp Next cll If Len(Plg) gt 0 Then Range(Left(Plg Len(Plg) - 1))Select End Sub

Pour seacutelectionner les lignes agrave la place des cellules Remplacer la ligne de code If cllValue = LaValeur Then Plg = Plg amp cllAddress() amp par If cllValue = LaValeur Then Plg = Plg amp cllRow() amp amp cllRow() amp

Recherche du nombre doccurence

Ce programme va compter le nombre de fois quil rencontre la valeur ValeurAChercher Sub RechercheNbOccurence() Reacutesultat = ApplicationCountIf(Range(AA) ValeurAChercher) MsgBox (Le texte ValeurAChercher est preacutesent amp Reacutesultat amp fois) End Sub

Rechercher la derniegravere cellule dune plage

Ce programme permet de positionner le curseur sur la derniegravere cellule dune plage correspondant agrave la cellule en cours Sub AllerADernierecellule() Seacutelectionne la plage en cours ActiveSheetUsedRangeSelect Seacutelectionne la derniegravere cellule de la plage en cours

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 44: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

ActiveSheetUsedRangeSpecialCells(xlCellTypeLastCell)Offset(0 0)Select End Sub

Recopier une plage variable vers une autre feuille du classeur

Ce programme permet de recopier une plage variable A8 agrave Gx vers une autre feuille (Feuil2) en A1 correspondant agrave la cellule en cours Sub SelectRecopie() Redeacutefinir la plage en fonction du nombre de lignes Seacutelectionner cette plage Copier les valeurs contenues dans cette plage sur la feuille 2 agrave la cellule A1 With Worksheets(1) Range([A1] [G1]End(xlDown))Copy Worksheets(2)[A1] End With End Sub

Reacutecupeacuterer la colonne active sous forme litteacuterale (A AB AZ etc)

Ce programme permet de reacutecupeacuterer la lettre de la colonne de la cellule active Sub LetCol() Dim Let_Col As String Let_Col = Left(Mid(ActiveCellAddress 2) _ Len(Mid(ActiveCellAddress 2)) - (Len(Mid(Mid(ActiveCellAddress 2) _ ApplicationSearch($ Mid(ActiveCellAddress 2) 1) + 1)) + 1)) MsgBox Let_Col End Sub Autre variante avec utilisation des valeurs VRAI(-1) et FAUX (0) Sub LettreColonne() Utilisation des valeurs VRAI (-1) et FAUX (0) Lettre_Col = Left(ActiveCellAddress(0 0) (ActiveCellColumn lt 27) + 2) MsgBox Lettre_Col End Sub

Reacutecupeacuterer la somme dune colonne dans une variable

Ce programme effectue la somme de la colonne A et la met dans une variable LaSomme Sub FaireSommeColonne() LaSomme = ApplicationSum(Range(A1)EntireColumn) MsgBox LaSomme End Sub

Reacutecupeacuterer le nombre de colonnes

1 - Nombre de colonnes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les colonnes vides) Sub NombreDeColonnes() NbColonnes=ActiveSheetUsedRangeColumnsCount MsgBox NbColonnes End Sub

2 - Nombre de colonnes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des colonnes vides) Sub NombreDeColonnes() NbColonnes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbColonnes End Sub

Reacutecupeacuterer le nombre de lignes

1 - Nombre de lignes comprises entre la premiegravere cellule et la derniegravere cellule de la plage seacutelectionneacutee (y compris eacuteventuellement les lignes vides) Sub NombreDeColonnes() NbLignes=ActiveSheetUsedRangeRowsCount MsgBox NbLignes End Sub

2 - Nombre de lignes comprises entre la colonne A (vide ou pas) et la derniegravere cellule utiliseacutee (cette seacutelection peut contenir des lignes vides) Sub NombreDeLignes() NbLignes = CellsSpecialCells(xlCellTypeLastCell)Column MsgBox NbLignes End Sub

Reacutecupeacuterer la somme du produit de 2 colonnes

Somme des N valeurs (A1B1 + A2B2 )

Ce programme effectue le produit des valeurs de la colonne A par celles de la colonne B et additionne ces reacutesultats Sub SommeProduit() Cells(1 A)Select NbLignes = Cells(Range(AA)Count ActiveCellColumn)End(xlUp)Row NbLignes = Cells(16 1)End(xlUp)Row TotalIntermediaire = 0

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 45: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

For Lgn = 2 To NbLignes Etiquettes en ligne 1 If Not Rows(NbLignes)Hidden Then TotalIntermediaire = TotalIntermediaire + Cells(Lgn A) Cells(Lgn B) End If Next Lgn MsgBox TotalIntermediaire End Sub

Reacutepertoire et nom de fichier dans pied de page

Proceacutedure agrave mettre dans This WorkBook

La mise a jour ce fait degraves que lon active un onglet Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim ZtPath As String ZtPath = ApplicationActiveWorkbookPath ActiveSheetPageSetupLeftFooter = ZtPath amp amp ampF End Sub

Supprimer les doublons dans une colonne

Ce programme efface les doublons dans la colonne sans supprimer les lignes Sub EffaceDoublonsColonnnes() Const Cell_Deacutepart As String = A1 Dim Fin As Range I As Long J As Long Col As Integer Dim ModeCalcul As Long With Application ModeCalcul = Calculation Calculation = xlCalculationManual ScreenUpdating = False End With Col = Range(Cell_Deacutepart)Column Set Fin = Range(Cell_Deacutepart)End(xlDown)(2) On Error Resume Next Do I = J + 1 J = Range(Cells(I 1) Fin)ColumnDifferences(Cells(I 1))(0)Row If J gt I Then Range(Cells(I + 1 1) Cells(J 1))ClearContents Loop Until Err ApplicationCalculation = ModeCalcul End Sub

Supprimer les lignes vides dune plage

Ce programme supprime les lignes vides dans une plage Sub DetruireLigne() DerniereLigne = ActiveSheetUsedRangeRowsCount ApplicationScreenUpdating = False For R = DerniereLigne To 1 Step -1 If ApplicationCountA(Rows(R)) = 0 Then Rows(R)Delete Next R End Sub

Supprimer un nom dans une feuille de calcul

Ce programme supprime le nom Base dans toutes les feuilles du classeur Sub SupprimeUnNom() For Each Nm In ActiveWorkbookNames If NmName Like Base Then NmDelete End If Next Nm End Sub

Supprimer tous les noms dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeTouslesNoms() For Each Nm In ActiveWorkbookNames NmDelete Next Nm End Sub

Supprimer tous les noms (avec un joker) dans une feuille de calcul

Ce programme supprime tous les noms dans le classeur Sub SupprimeNomsAvecJoker() For Each Nm In ActiveWorkbookNames

If NmName Like Base Then NmDelete End If End Sub

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 46: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Supprimer les lignes contenant du texte

Ce programme recherche dans la colonne A les cellules contenant du texte et supprime les lignes associeacutees agrave ces cellules Sub SupprimeLignesAvecTtexte() NbRw = ApplicationCountA(Columns(AA)) For Rw = NbRw To 1 Step -1 If ApplicationIsText(Cells(Rw 1)) Then Rows(Rw)Delete Next Rw End Sub

Utilser des macro-commandes dans une feuille proteacutegeacutee

Ce programme permet dutiliser des macro-commandes dans une feuille proteacutegeacutee par Outils Protection

Worksheets(Feuil1)Protect UserInterfaceOnly=True permet de manipuler par macro une feuille proteacutegeacutee tout en laissant la protection active par rapport aux manipulations de lutilisateur

Private Sub Workbook_Open() Worksheets(Feuil1)Protect UserInterfaceOnly=True End Sub

Instruction agrave mettre dans Workbook_Open cette proprieacuteteacute neacutetant pas enregistreacutee avec le classeur

Les fichiers (Excel ou autres) Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique des exemples de programmes se rapportant aux

traitement sur des fichiers Excel ou autres (txt ini log)

Ecrire dans un fichier de type texte (Date heure) agrave louverture ou la fermeture dExcel

Lire et increacutementer un fichier INI

Lire les enregistrements dans un fichier texte

Lister des fichiers texte et les ouvrir avec GetOpenFileName

Lister tous les fichiers XLS dans une feuille de calcul

Reacutealiser une copie du classeur actif sous un autre nom

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Ecrire dans un fichier de type texte (date et heure)

Ce programme utilise les eacuteveacutenements WorkBook_Open et Workbook_BeforeClose pour inscrire des informations dans un fichier de type texte lors de louverture et de la fermeture dExcel Dans lexemple le fichier texte se nomme activitelog

Private Sub Workbook_Open() Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now()

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 47: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Open LogFile For Append Shared As 1 Print 1 Ouverture dExcel a amp Donnees Close 1 End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim LogFile As String LogFile = CExcelactivitelog ChDir CExcel Donnees = Now() Open LogFile For Append Shared As 1 Print 1 Fermeture dExcel a amp Donnees Print 1 ---------------------------------- Close 1 End Sub

Exemple de fichier geacuteneacutereacute

Lire et increacutementer un fichier INI

Ce programme permet dincreacutementer un fichier incremini et de reacutecupeacuterer la valeur contenue dans ce fichier Arriveacute agrave 1000 le compteur est reacuteinitialiseacute agrave 1

Structure du fichier incremini [Numero] NUMERO=4

Ne pas oublier de copier les deux lignes qui suivent en tecircte de votre module

Declare Function GetPrivateProfileStringA Lib Kernel32 (ByVal lpAppName As _ String ByVal lpKeyName As String ByVal lpDefault As String ByVal lpReturnedString _ As String ByVal nSize As Long ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileStringA Lib Kernel32 (ByVal lpAppName _ As String ByVal lpKeyName As String ByVal lpString As String _ ByVal lpFileName As String) As Long

Sub IncreacutementeIni() Dim Compteur As String 10 GetPrivateProfileStringA Numero NUMERO 1 Compteur 10 CWindowsIncremini WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur) + 1) _ CWindowsIncremini MsgBox Le compteur est increacutementeacute agrave amp Compteur amp If Compteur = 1000 Then MsgBox ( La valeur de 1000 est atteinte Remise agrave 1 du compteur) Compteur = 1 WritePrivateProfileStringA Numero NUMERO CStr(CLng(Compteur)) _ CWindowsIncremini End If End Sub

Lire les enregistrements dans un fichier texte

Ce programme lit les diffeacuterents enregistrements dans un fichier texte et les inscrits dans une feuille de calcul

Structure du fichier Listingtxt JordanDurand15 EricBataille52 MarcelDupond35

Sub LireFichierTexte() Dim Prenom Nom Age Ouvre le fichier en lecture

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 48: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Open CExcelListingtxt For Input As 1 Effectue la boucle jusquagrave la fin du fichier Do While Not EOF(1) Lit les donneacutees dans trois variables Input 1 Prenom Nom Age Ecrit les donneacutees dans la feuille de calcul agrave partir de la ligne 2 Range(A65536)End(xlUp)(2)Value = Prenom Range(B65536)End(xlUp)(2)Value = Nom Range(C65536)End(xlUp)(2)Value = Age Loop Ferme le fichier Close 1 End Sub

Le reacutesultat

Lister des fichiers texte et les ouvrir avec GetOpenFileName

GetOpenFileName Affiche la boicircte de dialogue standard Ouvrir et lit un nom de fichier tapeacute ou seacutelectionneacute par lutilisateur sans reacuteellement ouvrir les fichiers Sub ChoixFichierTexteAOuvrir() ChDir C ChDir cExcel CeFichier =ApplicationGetOpenFilename(Text Files (txt) txt) If VarType(CeFichier) = vbBoolean Then Exit Sub Else WorkbooksOpenText Filename=CeFichier Origin=xlWindows _ StartRow=1 DataType=xlDelimited TextQualifier=xlDoubleQuote _ ConsecutiveDelimiter=False Tab=True Semicolon=False Comma=False _ Space=False Other=False FieldInfo=Array(1 1) End If End Sub

Lister tous les fichiers XLS dans une feuille de calcul

Ce programme permet de rechercher tous les fichiers Excel du reacutepertoire Excel de les placer dans un tableau et de copier ce tableau dans une feuille de calcul Sub RechercheClasseursSurDisque() Dim Classeurs() As String I As Long With ApplicationFileSearch NewSearch FileType = msoFileTypeExcelWorkbooks LookIn = CExcel SearchSubFolders = True Execute With FoundFiles ReDim Classeurs(1 To Count 1 To 1) For I = 1 To Count Classeurs(I 1) = Item(I) Next I ApplicationScreenUpdating = False With Range(A1)Resize(Count) Value = Classeurs Sort [A1] End With End With End With End Sub

Reacutealiser une copie du classeur actif sous un autre nom

Ce programme enregistre le classeur actif sous un autre nom (une copie) sans pour autant modifier le nom du classeur actif Sub SaveCopyAs() ActiveWorkbookSaveCopyAs CexcelDoublexls End Sub

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 49: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Reacutecupeacuterer le nom dun fichier seacutelectionneacute par GetOpenFileName

Cas dutilisation Par exemple si vous faites une lectureeacutecriture (via Open FileName For Input As 1) dun fichier seacutelectionneacute par GetOpenFilename pour inscrire les enregistrements dans un nouveau classeur (via WorkbooksAdd template=xlWorksheet) vous navez agrave aucun moment reacuteellement ouvert ce fichier mais vous voulez en connaicirctre le nom pour le donner agrave votre classeur actif

Public NameSansExtension As String Sub SelectionFichier() Dim LongFilename As String LongFilename = ApplicationGetOpenFilename(Text Files (txt) txt) ShortFilename (LongFilename) MsgBox Le nom sans extension du fichier est amp NameSansExtension End Sub

Function ShortFilename(LongFilename As String) As String For i = Len(LongFilename) To 1 Step -1 If Mid(LongFilename i 1) = Then Exit For Next ShortFilename = Mid(LongFilename i + 1 Len(LongFilename)) NameSansExtension = Mid(ShortFilename 1 Len(ShortFilename) - 4) End Function

Les fonctions personnaliseacutees Page mise agrave jour le 28032001

Inseacuterer le chemin du classeur dans une feuille de calcul

Somme des cellules avec un motif rouge par exemple

Inseacuterer le chemin dun classeur dans une feuille de calcul

Cette fonction insegravere le chemin du classeur dans la feuille de calcul

Le code

Code de la fonction InsereCheminClasseur

Function InsereCheminClasseur() As String ApplicationVolatile InsereCheminClasseur = ApplicationCallerParentParentFullName End Function

Somme des cellules avec un motif rouge

Cette fonction calcule la somme dune plage en fonction de la

couleur du motif des cellules

Le code

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 50: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Code de la fonction SumByColor

Function SumByColor(PlageEntree As Range CouleurPlage As Range) As Double Dim Cell As Range TempSum As Double ColorIndex As Integer ColorIndex = CouleurPlageCells(1 1)InteriorColorIndex TempSum = 0 On Error Resume Next For Each Cell In PlageEntreeCells If CellFormula lt gt Then If CellInteriorColorIndex = ColorIndex Then TempSum = TempSum + _ CellValue End If Next Cell On Error GoTo 0 Set Cell = Nothing SumByColor = TempSum End Function

Les paramegravetres de la fonction

PlageEntree Permet de seacutelectionner la plage agrave calculer

CouleurEntree Seacutelectionne la cellule servant de reacutefeacuterence pour la couleur du motif

Les formules Excel Page mise agrave jour le 10022002

Vous trouverez dans cette rubrique un recueil de formules pouvant vous rendre de

preacutecieux services

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Reacutealiser un filtre eacutelaboreacute (Champ avec condition ET)

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 51: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Calcul sur 12 mois glissants

Calcul sur les heures

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 52: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Calcul de lancienneteacute en Mois et Anneacutees

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 53: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Calculer une somme entre deux bornes

Exemples de formats personnaliseacutes

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 54: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Moyenne ne tenant pas compte des valeurs zeacutero

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute)

Le champ calculeacute permet dextraire les noms dont le salaire actuel

est gt= au salaire de deacutebut x 2

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 55: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Reacutealiser un filtre eacutelaboreacute (Champ calculeacute avec condition ET)

Extraire les noms dont la date de deacutebut est gt= au 31121997 ET la date de fin lt

01012001

Reacutecupeacuterer la valeur dune cellule reacutesultant dune intersection LigneColonne

Somme des cellules (A1 par ex) de plusieurs feuilles

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 56: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Somme dune colonne avec un nombre de lignes variable

Cas 1 Les valeurs commencent agrave la ligne 1 =SOMME(DECALER($A$1NB(AA)-NB(AA)))

Cas 2 Les valeurs commencent agrave la ligne 2

=SOMME(DECALER($A$1NB(AA)-NB(AA)-1))

Trouver le quantiegraveme du jour

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 57: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Trouver les dates mobiles (jours feacuterieacutes)

Les jours feacuterieacutes sont de deux sortes

Jours agrave date fixe (comme le 14 juillet le 11 novembre et le 25 deacutecembre)

Jours mobiles dont la date varie dune anneacutee sur lautre Ces jours feacuterieacutes mobiles

sont calculeacutes dapregraves la date du dimanche de Pacircques

Degraves lors que lon connaicirct la date du dimanche de Pacircques on peut en deacuteriver les dates de

tous les jours feacuterieacutes mobiles par simple addition

Le dimanche de Pacircques est le premier dimanche qui suit la premiegravere pleine lune apregraves

leacutequinoxe de printemps (21 mars)

La formule suivante signeacutee Norbert Hetterich renvoie la date du dimanche de Pacircques

pour lanneacutee A

(entre 1900 et 2078)

=FRANC((JOUR(MINUTE(A38)2+55)amp4ampA)7)7-6

Les jours feacuterieacutes mobiles en France et en Belgique sont le Lundi de Pacircques (Dimanche de

Pacircques (DP) + 1)

le Jeudi de lAscension (DP + 39) et le Lundi de Pentecocircte (DP + 50)

En partant de la formule de N Hetterich on peut donc obtenir facilement les dates de

ces trois jours feacuterieacutes pour une anneacutee donneacutee (entre 1900 et 2078)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 58: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Les graphiques Excel Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique un recueil de graphiques pouvant vous rendre de

preacutecieux services

Reacutealiser un graphique dynamique (Donneacutees en colonnes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en colonnes)

Reacutealiser un graphique dynamique (Donneacutees en lignes)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (Donneacutees en lignes)

Reacutealiser un graphique dynamique (donneacutees en colonnes)

Longlet sintitule Donneacutees et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 59: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs (en colonnes)

Longlet sintitule Etat Commandes et le fichier GraphiqueDynamique

Les donneacutees sont en colonnes

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 60: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Reacutealiser un graphique dynamique sur donneacutees en lignes

Longlet sintitule Personnel et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 61: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Reacutealiser un graphique dynamique sur les 12 derniegraveres valeurs en lignes

Longlet sintitule Effectif et le fichier GraphiqueDynamique

Les donneacutees sont en lignes

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 62: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Les menus et barres doutils

Vous trouverez dans cette rubrique des exemples pour creacuteer modifier ou personnaliser

les menus dExcel

Ajout dun item au menu Outils

1 - Ajouter un item intituleacute Exemple en derniegravere position du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 63: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un item intituleacute Exemple apregraves litem Protection du menu Outils

Le code pour installer litem dans le menu Outils Sub AddItemInMenuOutils() With ApplicationCommandBars(Tools)ControlsAdd(msoControlButton before=7) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils

Sub EffaceItem() CommandBars(Tools)Controls(Exemple)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun item au menu Outils Protection

Ajouter un item intituleacute Exemple dans le sous-menu Protection du menu Outils

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 64: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Le code pour installer litem dans le menu Outils Protection

Sub AddItemInMenuOutilsProtection() With ApplicationCommandBars(Protection)ControlsAdd(msoControlButton) Caption = Exemple OnAction = Affiche FaceId = 343 End With End Sub Le code pour effacer litem du menu Outils Protection Sub EffaceItem() CommandBars(Tools)Controls(Protection)Controls(4)Delete End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditems dans le menu Outils Protection - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Ajout dun nouveau menu

1 - Ajouter un menu Exemple dans la barre de menus apregraves le menu

Le code pour ajouter le menu Exemple Sub InserenouveauMenu() With CommandBars(1)ControlsAdd(msoControlPopup) Caption = Exemple With ControlsAdd(msoControlButton) Caption = Tri croissant FaceId = 210 BeginGroup = True OnAction = Affiche End With With ControlsAdd(msoControlButton) Caption = Tri deacutecroissant FaceId = 211 BeginGroup = True OnAction = Affiche End With End With End Sub Le code pour supprimer le menu Exemple Sub SupprimeNouveauMenu() CommandBars(1)Controls(Exemple)Delete End Sub Le code de laction associeacutee aux items Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un nouveau menu Exemple dans la barre de menus Style = vbYes Title = Ajout dun nouveau menu - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu Exemple dans la barre de menus avant le menu Format

Le code pour ajouter le menu Exemple avant le menu Format Ce code est identique agrave lexemple preacuteceacutedent sauf quil faut ajouter before=5 5 eacutetant le le numeacutero du menu avant lequel on veut inseacuterer le menu Exemple La ligne de code With CommandBars(1)ControlsAdd(msoControlPopup) devient With CommandBars(1)ControlsAdd(msoControlPopupbefore=5)

Ajout ditems au menu contextuel (clic droit)

1 - Ajouter un item Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 65: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuel() With ApplicationCommandBars(Cell)ControlsAdd(msoControlButton) Caption = Exemple BeginGroup = True FaceId = 343 OnAction = Affiche End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

2 - Ajouter un menu popup depuis litem Exemple dans menu contextuel (clic droit souris)

Le code pour ajouter le menu contextuel Sub InsereMenuContextuePopUp() With ApplicationCommandBars(Cell) With ControlsAdd(msoControlPopup) Caption = Exemple BeginGroup = False Sous-menu 1 (Exemple 11) ControlsAdd (msoControlButton) Controls(1)Caption = Exemple 11 With Controls(1)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 66: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

OnAction = Affiche FaceId = 351 End With Sous-menu 2 (Exemple 12) ControlsAdd (msoControlButton) Controls(2)Caption = Exemple 12 With Controls(2) OnAction = Affiche FaceId = 352 End With End With End With End Sub Le code pour supprimer le menu contextuel Sub SupprimeMenuContextuel() ApplicationCommandBars(Cell)Reset End Sub Le code de laction associeacutee agrave litem Exemple

Sub Affiche() Dim Msg Style Title Msg = Vous avez ajouteacute un item intituleacute Exemple dans le menu Outils Style = vbYes Title = Ajout ditem dans menu contextuel - copy Eric RENAUD - 111999 Response = MsgBox(Msg Style Title) End Sub

Masquer des items dans un menu (ou reacuteafficher)

1 - Rendre inaccesible le menu Outils

Le code pour rendre inaccessible litem Outils Sub InhibeMenuOutils() CommandBars(1)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils

Sub AfficheMenuOutils() CommandBars(1)Controls(6)Enabled = True End Sub

2 - Rendre inaccesible le menu Outils Protection

Le code pour rendre inaccessible litem Outils Protection

Sub InhibeOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = False End Sub Le code pour rendre accessible litem Outils Protection Sub AfficheOutilsProtection() CommandBars(1)Controls(6)Controls(6)Enabled = True End Sub

Supprimer laffichage dun menu (ou reacuteafficher)

Supprimer lintituleacute Outils de la barre de menus

Le code pour supprimer lintituleacute Outils de la barre de menus Sub SupprimeIntituleOutils() CommandBars(1)Controls(6)Visible = False End Sub Le code pour reacuteafficher lintituleacute Outils dans la barre de menus Sub ReinstalleIntituleOutils() CommandBars(1)Controls(6)Visible = True

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 67: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

End Sub

Seacutelection dans une feuille de calcul (agrave laide du code VBA)

Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes VBA pour effectuer

diffeacuterents types de seacutelection de cellules

Seacutelection dune plage avec la souris

Seacutelection dune plage

Seacutelection de 2 plages (non contiguumles)

Seacutelection de deux colonnes non contiguumles

Seacutelection de cellules caracteacuteristiques (par ex cellules eacutegales agrave 20)

Seacutelection de cellules vers le bas depuis la cellule active (Ctrl+Shift+Bas)

Seacutelection de cellules vers le haut depuis la cellule active (Ctrl+Shift+Haut)

Seacutelection de cellules vers la droite depuis la cellule active (Ctrl+Shift+Droit)

Seacutelection de cellules vers la gauche depuis la cellule active (Ctrl+Shift+Gauche)

Seacutelection de cellules dans la plage courante depuis la cellule active

Seacutelection de cellules contigues dans la colonne de la cellule active

Seacutelection de cellules contigues dans la ligne de la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Seacutelection dune plage avec la souris

Permet de seacutelectionner une plage avec la souris (Meacutethode InputBox) Sub SelectionPlageAvecSouris() Dim Plage As Range Set Plage = ApplicationInputBox(Seacutelectionnez une plage Seacutelection de cellules Type=8) MsgBox (La plage que vous avez seacuteleacutectionnez est amp PlageAddress) End Sub

Seacutelection dune plage

Permet de seacutelectionner la zone en cours par rapport agrave la cellule active Sub SelectionPlage() ActiveCellCurrentRegionSelect MsgBox (La plage seacutelectionneacutee est amp SelectionAddress) End Sub

Seacutelection de 2 plages (non contiguumles)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 68: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Permet de seacutelectionner deux plages discontinues (Plage A1Ax et C1Cx) Sub SelectionDiscontinue() Dim Z1 Z2 MaPlageMultiZone As Range Worksheets(Feuil1)Select Range(A1)Select ActiveCellEnd(xlDown)Select Zone1 = ActiveCellAddress SelectionOffset(0 2)Select Zone2 = ActiveCellAddress Set Z1 = Range(A1 Zone1) Set Z2 = Range(C1 Zone2) Set MaPlageMultiZone = Union(Z1 Z2) ZoneSelection = MaPlageMultiZoneSelect End Sub

Seacutelection de deux colonnes non contiguumles

Permet de seacutelectionner deux colonnes A et D par exemple Sub SelectionDeuxColonnesNonContigues() Soit les colonnes A (1) et D (4) agrave seacutelectionner NCol1 = 1 NCol2 = 4 Union(Cells(1 NCol1) Cells(1 NCol2))EntireColumnSelect End Sub

Seacutelection de cellules caracteacuteristiques

(par ex cellules eacutegales agrave 20)

Permet de seacutelectionner toutes les cellules dont la valeur est 20 Sub CellulesValeurDeterminee() La valeur 20 est saisie en E2 LaValeur = Range(E2)Value Range(A1)Select For Each Cll In ActiveCellCurrentRegion If CllValue = LaValeur Then plg = plg amp CllAddress() amp Next Cll If Len(plg) gt 0 Then Range(Left(plg Len(plg) - 1))Select End Sub

Seacutelection de cellules vers le bas depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlDown))Select

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 69: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

End Sub

Seacutelection de cellules vers le haut depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlUp))Select End Sub

Seacutelection de cellules vers la droite depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToLeft))Select End Sub

Seacutelection de cellules vers la gauche depuis la cellule active

Sub SelectDown() Range(ActiveCell ActiveCellEnd(xlToRight))Select End Sub

Seacutelection de cellules dans la plage courante depuis la cellule active

Sub SelectCurrentRegion() ActiveCellCurrentRegionSelect End Sub

Seacutelection de cellules contigues dans la colonne de la cellule active

Sub SelectActiveColumn() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la ligne 1 On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlUp) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlDown) Range(TopCell BottomCell)Select End Sub

Seacutelection de cellules contigues dans la ligne de la cellule active

Sub SelectActiveRow() If IsEmpty(ActiveCell) Then Exit Sub Ignore error si Activecell est dans la colonne A On Error Resume Next If IsEmpty(ActiveCellOffset(-1 0)) Then Set TopCell = ActiveCell Else Set TopCell = ActiveCellEnd(xlToLeft) If IsEmpty(ActiveCellOffset(1 0)) Then Set BottomCell = ActiveCell Else Set BottomCell = ActiveCellEnd(xlToRight) Range(TopCell BottomCell)Select End Sub

Seacutelection dune colonne entiegravere par rapport agrave la cellule active

Sub SelectEntireColumn() SelectionEntireColumnSelect End Sub End Sub

Seacutelection dune ligne entiegravere par rapport agrave la cellule active

Sub SelectEntireRow() SelectionEntireRowSelect End Sub

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 70: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Commandes codes fonctions etc agrave utiliser dans vos applications

Page mise agrave jour le 28032001

Adapter la largeur dune colonne en fonction de son contenu

Colums(A)AutoFit

Afficher un message ordinaire

MsgBox(Vous ecirctes le bienvenu)

Afficher un message dans la barre de status

ApplicationStatusBar=Programme en cours dexeacutecution

Copier les donneacutees issues dun filtre automatique vers une autre feuille

Sheets(Feuil1)AutoFilterRangeCopy Sheets(Feuil2)Range(A1)

ou

Sheets(Feuil1)Range(_FilterDatabase)Copy Sheets(Feuil2)Range(A1)

Deacutefinir limprimante par deacutefaut

ActivePrinter=Canon LBP-465 sur LPT1

Deacutefinir la ligne de titre

ActiveSheetPageSetUpPrintTitleRows=$1$1

Deacutelimiter du texte dans une cellule

ActiveCellWrapText=True

Documenter une fonction personnaliseacutee

ApplicationMacroOptions InsereCheminClasseur Reacutecupegravere le chemin du

classeur

InsereCheminClasseur Nom de la fonction

Reacutecupegravere le chemin du classeur Deacutefinition de la fonction

Figer le deacutefilement de leacutecran

ApplicationScreenUpdating=False

Inseacuterer un commentaire dans une cellule (non VBA)

=SOMME(A10A11)+N(Ceci est un commentaire)

Inseacuterer la formule SOMME agrave une position variable

Range(A1)End(xlDown)Offset(1 0)Value = =SUM(A1 amp Range_

(A1)End(xlDown)Address amp )

Redeacutefinir la plage pour utiliser la combinaison de touches Ctrl+Fin

Lorsque lon supprime des lignes ou colonnes Excel garde toujours la mecircme

reacutefeacuterence de la derniegravere cellule utiliseacutee bien quelle soit vide

Pour remeacutedier agrave cela une ligne de code

ActiveSheetUsedRange

Seacutelectionner la plage utiliseacutee dans une feuille de calcul

ActiveSheetUsedRangeSelect

Seacutelectionner la plage en cours sans prendre en compte la ligne de titres

With SelectionCurrentRegion

Intersect(Cells Offset(1))Select

End With

Seacutelectionner la zone en cours

Nota La zone en cours est une plage limiteacutee par toute combinaison de

lignes et de colonnes vides

Range(A1)CurrentRegionSelect

Somme dune plage variable (Non VBA)

Nota La plage se situe dans la colonne A (A1 agrave Ax) et celle-ci possegravede un titre =SOMME(DECALER(A2NB(AA)-1-NB(AA)-1))

Trouver la premiegravere ligne vide

Cette commande permet de trouver dans une plage la premiegravere ligne vide

NoLgn = ActiveSheetUsedRangeRow + ActiveSheetUsedRangeRowsCount

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 71: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Cette commande permet de trouver dans une colonne (A) la premiegravere ligne vide

premLiVide = Columns(1)Find( [A65536] xlByRows xlNext)Row

Des programmes de toutes sortes Page mise agrave jour le 3052002

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Reacutecupeacuterer le nom de login (reacuteseau)

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Reacutecupeacuterer le contenu dune variable denvironnement (SET)

Ce programme permet de reacutecupeacuterer une variable denvironnement (voir DOS

pour deacutetail sur commande SET)

Dans cet exemple la variable AU_LOCAL_DIR me retourne un chemin

(diffeacuterent suivant les utilisateurs) ougrave je trouve un fichier agrave traiter avec Excel Ce chemin est du type AU_LOCAL_DIR=frenaudaudrostmp

Le code

Code de la proceacutedure RechercheVariableEnvironnement

Sub RechercheVariableEnvironnement() Deacuteclaration des variables Dim EnvString Indx Msg PathLen Indx = 1 Initialise lindex agrave 1 Do Extrait la variable denvironnement (AU_LOCAL_DIR) EnvString = Environ (Indx) Veacuterifie lentreacutee AU_LOCAL_DIR If Left (EnvString 13 ) = AU_LOCAL_DIR= Then Extrait la longueur et met lentreacutee dans une variable PathLen = Len ( Environ ( AU_LOCAL_DIR )) Msg = Mid (EnvString 14 PathLen) Exit Do Else Pas dentreacutee AU_LOCAL_DIR donc on increacutemente Indx = Indx + 1 End If Loop Until EnvString =

If PathLen gt 0 Then MsgBox Msg Affiche le message frenaudaudrostmp Else MsgBox Il nexiste pas de variable amp denvironnement AU_LOCAL_DIR End If End Sub

Reacutecupeacuterer le nom de login (reacuteseau)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 72: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Cette fonction permet de reacutecupeacuterer le nom de login (et non pas le nom

dutilisateur deacuteclareacute dans Excel)

Le code

Code de la fonction GetUserName

Declare Function WNetGetUser Lib mprdll Alias WNetGetUserA ( ByVal lpName As String _

ByVal lpUserName As String lpnLength As Long ) As Long Const NoError = 0 Function GetUserName () Const lpnLength As Integer = 255 Dim status As Integer Dim lpName lpUserName As String lpUserName = Space$ (lpnLength + 1 )

status = WNetGetUser(lpName lpUserName lpnLength) If status = NoError Then lpUserName = Left$ (lpUserName InStr (lpUserName Chr ( 0 )) - 1 ) Else MsgBox Impossible dobtenir le login End End If GetUserName = lpUserName End Function

Code de la proceacutedure AfficheLogin

Sub AfficheLogin() MsgBox GetUserName End Sub

Reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette proceacutedure permet de reacutecupeacuterer une valeur stockeacutee dans la base de registre

Cette valeur est stockeacutee dans la cleacute HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

Jutilise personnellement cette proceacutedure pour increacutementer un numeacutero de facture

LectureEcriture dans la base de registre

Private Sub LectureRegistry() Lecture des infos dans la base de registre Call InfoRegistry Reacutecupeacuteration du Ndeg de facture NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Increacutementation du Ndeg de facture NumFac = NumFac + 1 Ecriture de la nouvelle valeur NumFac dans la base de registre SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=NumFac End Sub

Private Sub InfoRegistry() Lecture de la valeur dans la base de registre NumFac = GetSetting (appname= Facture Grand Cregraves section= NumFacture key= Numeacutero ) Si aucune valeur nest preacutesente dans la base de registre If NumFac = Then Numdepart = InputBox( Indiquer le Ndeg de votre derniegravere facture manuelle Initialisation du numeacutero de facture ) Si on clique sur le bouton Annuler fin de proceacutedure If Numdepart = Then End Sinon on inscrit le numeacutero saisi dans la boicircte de dialogue SaveSetting appname= Facture Grand Cregraves section= NumFacture key= Numeacutero setting=Numdepart

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 73: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

End If End Sub

Effacement de la cleacute dans la base de registre

Sub EffaceRegistry() Effacement de la cleacute dans la base de registre On Error Resume Next DeleteSetting Facture Grand Cregraves End Sub

Echanges de donneacutees entre Excel et Word Page mise agrave jour le 28032001

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Word ou reacutecupeacuterer des donneacutees Word dans Excel

Ces exemples fonctionnent avec Word et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets de Word

Dans Excel choisissez la commande Reacutefeacuterences du menu Outils de Visual Basic Editor et cochez Microsoft Word 90 Object Library

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Copier des donneacutees Excel dans un nouveau document Word (format tabulation)

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Reacutecupeacuterer les donneacutees dun document Word et les copier dans Excel

Ce programme permet daller chercher des donneacutees dans un document Word de les copier de les coller dans Excel et de refermer Word

Sub DonneacuteesWordVersExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication AppWordShowMe AppWordVisible = True Ouvre le document Word (Fichierdoc) et effectue une copie des donneacutees

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 74: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Set DocWord = AppWordDocumentsOpen( cExcelFichierdoc ReadOnly= True ) With AppWord SelectionWholeStory SelectionCopy End With Copie des donneacutees dans Excel ThisWorkbookWorksheets( Feuil1 )Paste Fermeture de Word AppWordApplicationQuit ApplicationCutCopyMode = False End Sub

Les donneacutees Word La copie dans Excel

Copier des donneacutees Excel dans un document Word (format tableau)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees sous forme de tableau

Sub EnvoyerDonneesExcelVersWord() Dim DocWord As WordDocument Dim AppWord As WordApplication

Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc ReadOnly= False ) Copie les donneacutees Excel ThisWorkbookWorksheets( Feuil1 )Range( A1B6 )Copy Colle les donneacutees dans Word DocWordRangePasteSpecial ApplicationCutCopyMode = False DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un document Word (format tabulations)

Ce programme permet de copier des donneacutees dExcel douvrir un document Word et dy coller les donneacutees Les donneacutees eacutetant seacutepareacutees par des tabulations

Sub CopierDonneesExcelVersWord() Range( A1B6 )Copy Set WW = CreateObject ( wordapplication ) WWVisible = True

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 75: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

WWDocumentsAdd WWSelectionPasteSpecial Link= False DataType=wdPasteText Placement= _ wdInLine DisplayAsIcon= False End Sub

Les donneacutees Excel La copie dans Word

Copier des donneacutees Excel dans un tableau Word afin de le compleacuteter

Ce programme permet de copier des donneacutees dExcel douvrir un document Word existant dajouter une ligne au tableau existant dans Word et de compleacuteter chaque cellule de la ligne creacuteer

Sub RemplirTableauWordDepuisDonneacuteesExcel() Dim DocWord As WordDocument Dim AppWord As WordApplication Set AppWord = New WordApplication ApplicationDisplayAlerts = True AppWordShowMe AppWordVisible = True Ouvre le document Word Set DocWord = AppWordDocumentsOpen( cexcelFichierdoc _ ReadOnly= False )

Copie les donneacutees Excel Contrats_ISBN = Range( A2 )Value Contrats_Titre = Range( B2 )Value Contrats_Nom = Range( C2 )Value Colle les donneacutees dans Word DocWordTables( 1 )RowsAdd Derligne = DocWordTables( 1 )RowsCount With DocWordTables( 1 ) Cell(Derligne 1 )RangeInsertAfter Contrats_ISBN Cell(Derligne 2 )RangeInsertAfter Contrats_Titre Cell(Derligne 3 )RangeInsertAfter Contrats_Nom End With DocWordApplicationActiveDocumentSave AppWordApplicationQuit End Sub

Le tableau Word avant mise agrave jour

Les donneacutees Excel agrave copier dans le tableau Word

Le tableau Word apregraves mise agrave jour

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 76: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Echanges de donneacutees entre Excel et Access Page mise agrave jour le 1082002

Vous trouverez dans cette rubrique des exemples de programmes permettant denvoyer

des donneacutees Excel vers Access de reacutecupeacuterer des donneacutees dAccess dans Excel ou de mettre agrave jour des enregistrements dans Access depuis Excel

Ces exemples fonctionnent avec Access et Excel 2000 Ils nont pas eacuteteacute testeacute sous la

version 97

Pour que ces exemples fonctionnent vous devrez creacuteer une reacutefeacuterence de bibliothegraveques

dobjets daccegraves

aux donneacutees de Microsoft (DAO) Dans Excel choisissez la commande Reacutefeacuterences du

menu Outils de Visual Basic Editor et cochez Microsoft DAO 36 Object Library

Un lien inteacuteressant (mes sources) traitant de External Data Access with DAO (Data Access Objects) and ADO (ActiveX Data Objects)

Envoyer les donneacutees dune feuille Excel vers une table Access

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une

requecircte

Mettre agrave jour un enregistrement dans Access depuis Excel

Envoyer les donneacutees dune feuille Excel vers une table Access

Ce programme permet de copier les donneacutees dune feuille de calcul Excel vers une table Access

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table recevant les donneacutees Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel dougrave lon exporte les donneacutees --gt DAOSheet

Sub WritingWorksheetData_DAO() Dim Plage As Range Dim Array1 As Variant Dim x As Variant

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 77: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Commandesmdb Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Factures dbOpenDynaset) Deacutetermination de la taille de la plage agrave envoyer vers Access Set Plage = Worksheets( DAOSheet )Range( A1 )CurrentRegionOffset( 1 0 ) Set Plage = PlageResize(PlageRowsCount - 1 PlageColumnsCount) PlageSelect Lecture de la plage pour renvoyer une valeur contenant un tableau Array1 = PlageValue Ecriture des donneacutees depuis Excel vers les enregistrement de la table Factures For x = 1 To UBound (Array1 1 ) With Rs1

AddNew Fields( NoFacture ) = Array1(x 1 ) Fields( Client ) = Array1(x 2 ) Fields( Date ) = Array1(x 3 ) Fields( Solde ) = Array1(x 4 ) Update End With Next Fermeture de la base Commandesmdb Db1Close Effacement des donneacutees copieacutees vers la base (sauf les titres) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents End Sub

Les donneacutees Excel

Les donneacutees copieacutees dans la table Factures

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb )

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 78: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table Set Rs1 = Db1OpenRecordset( Name = Factures Type =dbOpenDynaset) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

Reacutecupeacuterer les donneacutees dune table Access dans une feuille de calcul Excel via une requecircte

Ce programme permet de reacutecupeacuterer les donneacutees dune table Access par lintermeacutediare dune requecircte et de les copier dans une feuille Excel

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave reacutecupeacuterer dans Excel --gt Factures Champs de la table Factures --gt NoFacture Client Date et Solde Nom de la requecircte --gt Factures pour un client Code SQL --gt SELECT FacturesNofacture FacturesClient FacturesDate FacturesSolde FROM Factures WHERE (((FacturesClient) Like ALLEE DES VINS)) Feuille de calcul Excel recevant les donneacutees de la table --gt DonneacuteesDataBase

Sub CopyFromRecordset_DAO() Dim Db1 As Database Dim Rs1 As Recordset Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Ouverture de la table Factures Un objet Recordset repreacutesente les enregistrements dune table

Set Rs1 = Db1OpenRecordset( Name = Factures pour un client Type =dbOpenSnapshot) Effacement des donneacutees existantes dans la WorkSheet (sauf les titres) et copie des enregistrements With Worksheets( DonneacuteesDataBase )Range( A2 ) With SelectionCurrentRegion Intersect(Cells Offset( 1 ))Select End With SelectionClearContents CopyFromRecordset Rs1 End With Fermeture de la Base de donneacutees

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 79: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Db1Close End Sub

Les donneacutees de la table Factures

Les donneacutees reacutecupeacutereacutees dans la feuille Excel

La requecircte Factures pour un client en mode Creacuteation

Mettre agrave jour un enregistrement dans Access depuis Excel

Ce programme permet de mettre agrave jour dans la table Factures le champ (Solde) correspondant agrave lenregistrement dont le Ndeg de facture est eacutegal agrave la variable NdegFacture

Deacutefinition des eacuteleacutements utiliseacutes Nom de la base de donneacutees --gt Commandesmdb Table posseacutedant les donneacutees agrave mettre agrave jour --gt Factures Champ de la table Factures agrave mettre agrave jour --gt Solde Recherche agrave partir du --gt NoFacture Note Afin de proposer les 2 possibilteacutes de syntaxe lexemple se propose de tester quel est le type de la variable Nofacture car la syntaxe est diffeacuterente suivant que la variable est un nombre (vbInteger) ou une chaicircne (vbString)

Sub UpdateDataAccess_DAO()

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne

Page 80: Astuces et code VBA pour Excel - mcours.net · Astuces et code VBA pour Exce Rubriques Classeurs (Workbooks) Contrôles et Formulaires Feuilles (Worksheets) Fichiers (XL ou autres)

Dim Db1 As Database TypeVariable = VarType (NumFacture) Ouverture de la base de donneacutees Set Db1 = DBEngineOpenDatabase(ThisWorkbookPath amp Commandesmdb ) Mise agrave jour de lenregistrement If TypeVariable = 2 Then La variable Numfacture est de type vbInteger (2) Db1Execute UPDATE Factures SET Solde= Oui WHERE NoFacture = amp NumFacture Else La variable Numfacture est de type vbString (8) Db1Execute UPDATE Factures SET Solde = Oui WHERE NoFacture = amp NumFacture amp End If Db1Close End Sub

Teacuteleacutechargement

Page mise agrave jour le 23042001

Vous trouverez sur cette page des exemples preacutesenteacutes dans les diffeacuterentes rubriques et

disponibles en teacuteleacutechargement

Exemples preacutesents sur le site Fichier Archive

Boite de dialogue avec case agrave cocher

Boite de dialogue avec boutons doptions

Boite de dialogue avec liste deacuteroulante

Boite de dialogue avec liste deacuteroulante modifiable

Boite de dialogue avec liste deacuteroulante modifiable simplifieacutee

Boite de dialogue avec liste deacuteroulante agrave seacutelection multiple

Boite de dialogue avec liste deacuteroulante agrave deux colonnes

Boite de dialogue avec liste deacuteroulante combineacutee

Le controcircle Calendar (Calendrier)

Le controcircle ProgressBar version 60

Supprimer les doublons dans une colonne