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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
‘Calcule la nouvelle addresse IP (incrément de 1)
Function NewIP(ByVal myIP As String, Digit As Integer) As Variant
Dim j As Integer, X As Integer
Dim IP
IP = Split(myIP, « . »)
If IP(Digit) + 1 > 255 Then
IP(Digit) = 0
IP = Join(IP, « . »)
IP = NewIP(IP, Digit – 1)
Else
IP(Digit) = IP(Digit) + 1
IP = Join(IP, « . »)
End If
NewIP = IP
End Function
|
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
(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
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)
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)
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)
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)
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"