Codes utiles VBA Excel

Voici un petit bout de code que j’ai fait pour solutionner un problème récent.

Le problème est le suivant :  Considérant une adresse IP de départ, générer une liste de N autres adresses IP (incrémentées de 1). Il faut bien sûr savoir qu’une adresse IP est composée de 4 groupes de nombres compris entre 0 à 255, séparés par des points.

Par exemple : 127.168.1.1

Les valeurs ne peuvent pas être plus grandes que 255. Ainsi, si on a 127.168.1.255, la prochaine adresse IP sera 127.168.2.0.

Voici donc le code:

Il s’agit d’une fonction personnalisée récursive (car elle s’appelle elle-même).

pour l’utiliser, taper en A1 une adresse IP  : 127.168.1.250

En B1 écrire la formule : =NewIP(A1, 3) et tirer vers le bas.  (0 pour le 1er groupe de chiffres, 3 pour le dernier groupe)

Compter le nombre de fichiers dans un répertoire avec une (ou des) extensions passées en paramètres

 

Dans un module en VBA, copier/coller le code suivant :


Sub AfficheTotalFichiers()
    Debug.Print  NombreFichiers("C:\Mes Documents\", "docx", "xlsx")
End Sub

‘Fonction qui compte le nombre de fichiers dans un répertoire
Function NombreFichiers(Chemin As String, ParamArray LesExtensions() As Variant) As Long
    Dim Fichier As String
    Dim Extension As Variant
    Dim Compteur As Long

    For Each Extension In LesExtensions
        Fichier = Dir(Chemin & « *. » & Extension)
            Do Until Fichier = «  »
            Compteur = Compteur + 1
            Fichier = Dir
        Loop
    Next

    NombreFichiers = Compteur
End Function

 

Parcourir la liste des control sur un formulaire (CheckBox, TextBox, ComboBox…)

 

A placer dans un UserForm. Cela fonctionne sur n’importe quel type de control.


Dim objControl As Control

‘variante 1
For Each objControl In Me.Controls
  If TypeOf objControl Is MSForms.TextBox Then ‘modifier ici le type si nécessaire
    MsgBox objControl.Name
  End If
Next

‘variante 2
For Each objControl In Me.Controls
  If TypeName(objControl) = « TextBox » Then ‘modifier ici le type si nécessaire
    MsgBox objControl.Name
  End If
Next

 

Procédure pour supprimer du code VBA qui aurait été associé directement à une feuille de calcul

 

Sub PurgeCode()
    For Each VBComp In VBComps
        If VBComp.Type = 100 Then
           With VBComp.CodeModule
               .DeleteLines 1, .CountOfLines
           End With
        End If
    Next VBComp
End Sub

Vérification de la saisie dans une TextBox

 

A placer sur l’événement KeyPress d’une TextBox

Gestion de certaines valeurs autorisées :


Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    'n'accepte que les chiffres et le /
    If InStr("1234567890/", Chr(KeyAscii)) = 0 Then KeyAscii = 0: Beep
End Sub

Gestion de la décimale virgule / point


Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 Select Case KeyAscii
    Case 44, 46 ' que l'on frappe une virgule ou un point
      If InStr(TextBox1.Text, ",") Then 'si déjà une virgule présent
         KeyAscii = 0 'on ne permet pas deux virgules
      Else ' sinon
        KeyAscii = 44 'on force la une virgule
      End If
    Case 48 To 57
      'on laisse passer car ce sont des chiffres
    Case Else
      KeyAscii = 0 'on ne laisse pas passer
 End Select
End Sub

 

Manipuler Word en Vba depuis Excel par exemple

 

'**************************************************************************************
'  Manipuler Word en VBA
'  ajouter la référence à Microsoft Word xx.x library au projet 

'  (Menu Projet >> Références...)
'**************************************************************************************
    

Sub GestionWord ()

   
Dim AppWord As Word.Application

    On Error Resume Next

    ‘ Cherche une instance de Word si elle existe
    Set AppWord = GetObject(, « Word.Application »)

    If Err <> 0 Then
    ‘ Si GetObject échoue, utiliser CreateObject pour créer une instance de Word
        Set AppWord = CreateObject(« Word.Application »)
    End If

    ‘ ajoute un nouveau document
     AppWord.Documents.Add

     ‘ insère du texte au point d’insertion
     AppWord.Selection.TypeText Text:="Liste des Clients"

     ‘ sauter une ligne
     AppWord.Selection.TypeParagraph

     ‘ copie le contenu de A1 dans le document Word
     AppWord.Selection.TypeText Text:= » » & Range(« A1 »).Value

     ‘ enregistre les modifications
     AppWord.Documents.Save

     ‘ rend Word visible
     AppWord.Visible = True

    ‘ Quitte Word
     AppWord.Quit

    ‘ Vide l’objet en mémoire
    Set AppWord = Nothing

End Sub

 

Vérifier par VBA si un lecteur ou un dossier (répertoire) ou un fichier existe

 

Cocher la bibliothèque  Microsoft Scripting Runtime dans Outils / Références

 

Dans un module en VBA, copier/coller le code suivant :


Public oFSO As Scripting.FileSystemObject
Public oFichier As Scripting.File 'pour gérer un fichier
Public oTxt As Scripting.TextStream 'pour gérer le contenu

Function VerifLecteur(Lecteur As String) As Boolean
    ‘permet de tester l’existence d’un lecteur
    ‘initialisation de l’objet oFSO
    Set oFSO = New Scripting.FileSystemObject
    ‘test si le lecteur  existe
    If oFSO.DriveExists(Lecteur) = True Then
        VerifLecteur = True
    Else
        VerifLecteur = False
    End If
End Function

Function VerifRep(Repertoire As String) As Boolean
    ‘permet de tester l’existence d’un répertoire
    ‘initialisation de l’objet oFSO
    Set oFSO = New Scripting.FileSystemObject
    ‘test si le lecteur  existe
    If oFSO.FolderExists(Repertoire) = True Then
        VerifRep = True
    Else
        VerifRep = False
    End If
End Function

Function VerifFich(Fichier As String) As Boolean
    ‘permet de tester l’existence d’un fichier
    ‘initialisation de l’objet oFSO
    Set oFSO = New Scripting.FileSystemObject
    ‘test si le lecteur  existe
    If oFSO.FileExists(Fichier) = True Then
        VerifFich = True
    Else
        VerifFich = False
    End If
End Function

Dans un autre module, faire appel à ces fonctions, par exemple de la manière suivante :


Sub Test()
    'initialisation de l'objet oFSO
    Set oFSO = New Scripting.FileSystemObject

    ‘test sur un lecteur
    If VerifLecteur(« P ») = True Then
        MsgBox « le lecteur existe »
    Else
        MsgBox « le lecteur n’existe pas »
    End If

    ‘test sur un dossier (répertoire)
    If VerifRep(« C:\Android ») = True Then
        MsgBox « le repertoire existe »
    Else
        MsgBox « le repertoire n’existe pas »
    End If

    ‘test sur un fichier
    If VerifFich(« C:\Windows\win.ini ») = True Then
        MsgBox « le fichier existe »
    Else
        MsgBox « le fichier n’existe pas »
    End If

End Sub

 

Intercepter touche Entrée dans un TextBox

Il suffit d’utiliser l’événement « KeyDown » et de vérifier si le code renvoyé correspond à la touche ENTREE


Private Sub TexBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then
        'mon code
    End If
End Sub

Nombre de jours ou mois ou années entre 2 dates

 
Voici 3 fonctions permettant de retrouver le nombre de jours ou de mois ou d’années entre 2 dates.
(la date 1 doit être inférieure à la date 2)

1) Placer le code suivant dans un module :


'Nombre d'années
Function DifDateAnnee(pDate1 As Date, pDate2 As Date) As Long
    DifDateAnnee = DateDiff("yyyy", pDate1, pDate2)
End Function

'Nombre de mois
Function DifDateMois(pDate1 As Date, pDate2 As Date) As Long
    DifDateMois = DateDiff("m", pDate1, pDate2)
End Function

'Nombre de jours
Function DifDateJour(pDate1 As Date, pDate2 As Date) As Long
    DifDateJour = DateDiff("d", pDate1, pDate2)
End Function

2) Puis faire appel à cette fonction dans une procédure quelconque :

Sub DifferenceEntre2Dates()
    
    Dim Date1 As Date, Date2 As Date
    Date1 = « 01/12/2013 »
    Date2 = « 15/04/2016 »
    
    MsgBox « Nombre d’années entre les 2 dates :  » & DifDateAnnee(Date1, Date2)
    MsgBox « Nombre de mois entre les 2 dates :  » & DifDateMois(Date1, Date2)
    MsgBox « Nombre de jours entre les 2 dates :  » & DifDateJour(Date1, Date2)

End Sub

 

Trouver le numéro de la semaine à partir d’une date

 
Voici une fonction permettant de déduire le numéro de la semaine dans une année.
Attention à toujours vérifier pour une date qui s’approche du 31/12 (qui appartient donc à une semaine à cheval sur l’année suivante) : dans ce cas, cette fonction renverra la valeur 1 (pour la semaine 1 de l’année suivante).

1) Placer le code suivant dans un module :
Function Semaine(UneDate As Date) As Integer
   Semaine = Format(UneDate, "ww", , vbFirstFourDays)
End Function

2) Appeler la fonction de cette manière :
Sub NumeroDeSemaine ()
   MsgBox Semaine(#10/31/2013#)
End Function

 

Créer un bouton « Parcourir » pour sélectionner un Répertoire (Excel, Word, Access)

 
1) Créer un bouton sur un Userform, puis gérer l’événement Click côté code en intégrant le code ci-dessous


Private Sub CommandButton1_Click()

    Dim Repertoire As FileDialog
    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
    Repertoire.Show
    If Repertoire.SelectedItems.Count > 0 Then
        MsgBox Repertoire.SelectedItems(1)
    Else
        MsgBox "Aucun Répertoire Sélectionné"
    End If

End Sub

 

Trouver la lettre d’une colonne à partir de son numéro (Excel)

 
Le plus simple est de créer une fonction qui renverra à la demande la lettre :

1) Placer le code suivant dans un module :


'Fonction qui renvoie la lettre à partir du numéro d'une colonne
Public Function lettre_colonne(colonne As Integer)
    lettre_colonne = Split(Cells(1, colonne).Address, "$")(1)
End Function

2) Puis faire appel à cette fonction dans une procédure quelconque :

 

Comment vérifier si un fichier existe ou non (Excel, Word, Access)

 
Le plus simple est de créer une fonction qui renverra Vrai ou Faux en fonction du résultat

1) Placer le code suivant dans un module :


'Fonction qui vérifie si un fichier existe
Public Function FichierExiste(Chemin As String) As Boolean
    If Dir(Chemin) = "" Then
         FichierExiste = False
    Else
         FichierExiste = True
    End If
End Function

2) Puis faire appel à cette fonction dans une procédure quelconque :


If FichierExiste("C:\Dossier\toto.xlsx") = True then 


    'procédure si le fichier existe
Else
    'procédure si le fichier n'existe pas
End If

 

Modifier par code le nom VBA d’une Feuille de Calcul (pas le nom de l’onglet)

 
Placer ce code dans une procédure ou une fonction dans l’éditeur VBA :

NomActuelVba= ActiveSheet.CodeName
ActiveWorkbook.VBProject.VBComponents(NomActuelVba).Name = "NomFeuilleCoteVBA"

A ne pas confondre avec ce code qui modifie le nom de l’onglet coté Excel :

ActiveSheet.Name = "NomFeuille"

 
   Envoyer l'article en PDF   

Laisser un commentaire