Fonctionnement général d'un code VBA... [Résolu/Fermé]

Signaler
-
 maniqk -
Bonjour,

Je suis tout jeune débutant en VBA et je dois actuellement mettre à jour un script.
Ma question est assez simple :
Dans ce script j'ai pas mal de sous routines et fonctions, je voudrais juste savoir s'il existe l'équivalent d'un "main" en C ? Est ce que le programme va lire une seule partie de mon script et faire appel aux fonctions/sous routines qui sont dedans ou bien est ce qu'il va lire la totalité du code ?

Je sais pas si c'est clair mais dans mon script par exemple, les fonctions et sous routines sont toutes dans le même module, et j'ai remarqué que certaines n'étaient pas appelées. Est ce qu'elles vont être exécutées tout de même ?

Merci d'avance,
maniqk



2 réponses

Messages postés
12272
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
14 mai 2020
2 423
Bonjour,

Peux tu nous placer, ici même dans une réponse, le code complet de ton Module?
Bonjour Pijaku,

Je pourrais le mettre mais il fait 1700 lignes... J'en mets juste une partie mais je ne pense pas que ça ait de l'importance pour ma question

Option Explicit
Const VersionLogiciel = "2.02 du 28/02/2007"
Global glocal
Global NoBloc As String
Global Chemin_Atr As String
Global chemin As String
Global Commande_Atr As String
Global Fichier_Tol_Atr As String
Global classeur_atr As String '= "PVAI_ACG.XLS"
Global classeur_pvc As String '= "PVC_ACG.XLS"
'Const fp = "Poutre_umi.xls"
Global fp As String
Global FichRes As String
Global Fichier
Global titre As Integer
Global freqx As Single
Global freqy As Single
Global freqz As Single
Global tabmes(1000, 100) As Double
Global FEG(3) As Double
Global FEA(3) As Double
Global VersionBanc As String

Declare Function htonl Lib "ws2_32.dll" (ByVal l As Long) As Long
Declare Function htons Lib "ws2_32.dll" (ByVal l As Integer) As Integer


Public Sub DEB00()
Dim FichErr As String
Dim i As Integer
Dim rep As Integer
Dim s1 As String
Dim s2 As String
Dim FichierVersion As String

On Error Resume Next
fp = ActiveWorkbook.Name
Windows(fp).Activate
Application.Cursor = xlWait
Application.Cursor = xlDefault
Application.ScreenUpdating = False
chemin = Range("chemin").Value
Chemin_Atr = Range("chemin").Value + "\RECETTE\PVAI"
Commande_Atr = Range("Commande").Value
classeur_atr = Range("classeur_atr").Value
classeur_pvc = Range("classeur_pvc").Value
NoBloc = Range("NoBloc").Value
FEG(1) = Range("Param!FEG1").Value
FEG(2) = Range("Param!FEG2").Value
FEG(3) = Range("Param!FEG3").Value
FEA(1) = Range("Param!FEA1").Value
FEA(2) = Range("Param!FEA2").Value
FEA(3) = Range("Param!FEA3").Value

'ouverture des fichiers PVAI et PVC vierges
Workbooks.Open Filename:="D:\MMT_V01\" & classeur_atr
Workbooks.Open Filename:="D:\MMT_V01\" & classeur_pvc


MkDir Chemin_Atr
FichRes = Chemin_Atr + "\Res_Rec_" + NoBloc + ".INI"
Open FichRes For Binary As 1
Close 1
Kill FichRes
rep = EcritIni("RESULTATS", "SerialNumber", Strings.Format$(div_val(NoBloc)), FichRes)
titre = 1
Windows(fp).Activate
info "traitement fichier Compo"
Fichier = chemin + "\Recette\" + Range("Compo").Value
FichierCompo
'Modif 03/07/2013 lecture des données Histo_Fugas et CFG FUGAS
Windows(fp).Activate
Fichier = chemin + "\Init\" + Range("HISTO_FUGAS").Value
Histo_Fugas
Windows(fp).Activate
Fichier = chemin + "\Calibration\" + Range("HISTO_FUGAS").Value
Histo_Fugas


Windows(fp).Activate
Fichier = chemin + "\Init\" + Range("Config_FUGAS").Value
CFG_Fugas
Windows(fp).Activate
Fichier = chemin + "\Calibration\" + Range("Config_FUGAS").Value
CFG_Fugas


et plus loin toutes les sous routines/fonctions :

Sub nomCellules()

Dim i As Integer
Dim nom As String
For i = 1 To 54
nom = Cells(1, i).Value
Cells(1, i).Name = nom
Next i

End Sub

Public Sub RenseigneResultats_atr()
Windows(classeur_atr).Activate
Sheets("NomCell").Activate
nb_val = Application.CountA(Sheets("NomCell").Range("A:A"))
MsgBox "nb_val = " & nb_val
ReDim tableau(nb_val) As String
For i = 1 To nb_val
tableau(i) = Cells(i, 1).Value
Next i

Sheets("Données").Activate
fichCalib = Chemin_Atr & "\CALIB_" & NoBloc & ".ini"
fichRecette = Chemin_Atr & "\RECETTE_" & NoBloc & ".ini"
fichCalpente = Chemin_Atr & "\CALPENTE_" & NoBloc & ".ini"

Dim t As String * 255
For i = 1 To nb_val
valeur = tableau(i)
r = LitIni("RESULTATS", valeur, "RIEN", t, 255, fichCalib)
res = DIV_Rtrim(t)
If res = "RIEN" Then
r = LitIni("RESULTATS", valeur, "RIEN", t, 255, fichRecette)
res = DIV_Rtrim(t)
End If
If res = "RIEN" Then
r = LitIni("RESULTATS", valeur, "RIEN", t, 255, fichCalpente)
res = DIV_Rtrim(t)
End If

If res <> "RIEN" Then
Range(valeur).Value = res
End If

Next i

End Sub


et plein d'autres fonctions ensuite...
Messages postés
12272
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
14 mai 2020
2 423
Bon.
Ce que tu nous donnes là est insuffisant pour t'expliquer clairement le déroulement de cette macro.

Ce que l'on peut en dire :

1- si tu es débutant, accroches toi, ça ne va pas être simple de mettre ça à jour,

2- 1700 lignes de code.... Pfiou! Bon courage!

3- La Sub DEB00 semble être ma procédure "principale", celle que l'on lance pour que la macro se "déroule" et donne le résultat escompté.

4- Petite explication sur les lignes de code ci-dessus :

4 a- Sous Option Explicit et au dessus de Declare Function blabla, tu as les variables globales (valides sur tout le projet (dans tous les modules), dans chcune des procédures et fonctions)

4 b-
Declare Function htonl Lib "ws2_32.dll" (ByVal l As Long) As Long
Declare Function htons Lib "ws2_32.dll" (ByVal l As Integer) As Integer

Il s'agit ici d'appels de fonctions extérieures au fichier. Ces lignes font appel aux fonctions htonl et htons présentes dans la librairie ws2_32.dll

4 c- MkDir Chemin_Atr
Fait appel à la fonction VBA MkDir. Tu remarqueras qu'aucune des fonctions dans ton module ne s'appelle MkDir.

4 d- Kill FichRes : Idem que pour MkDir.
Il s'agit ici de fonctions présentes sur VBA.

4 e- rep = EcritIni("RESULTATS", "SerialNumber", Strings.Format$(div_val(NoBloc)), FichRes)
Ici, le code appelle la fonction EcritIni. Celle-ci doit être présente dans le module. Elle fait un traitement à partir des paramètres passés et renvoie une valeur, en l'occurence un entier (Integer).

4 f- info "traitement fichier Compo"
Ici, le code appelle une procédure, une Sub. Pas d'affectation à une variable comme ci-dessus avec rep. Donc, à ce moment de la procédure principale, on a besoin que soit fait un traitement, et donc on appelle ce que tu appelles une sous-routine.

4 g- Idem pour FichierCompo ou encore Histo_Fugas

N'hésite pas à poser des questions bien précises en cas de difficulté.
Oui en fait je me suis dit que j'ai pas besoin de tout mettre étant donné que je cherche juste à savoir si tout est lu ou non. J'ai saisi le fonctionnement de la macro (ce qu'elle fait) ce n'est pas vraiment mon plus gros problème même si j'ai mis du temps à la comprendre !

Il y a en réalité deux autres modules où sont déclarées ou implémentées d'autres fonctions... EcritIni est par exemple déclarée dans un de ces modules via un alias (WritePrivateProfileStringA) [je ne dois pas employer le bon vocabulaire mais ça doit rester compréhensible]

Bref ! En tout cas je crois que tu as répondu à ma question en me disant que la Sub "Deb00" semble être la procédure principale.

Une question demeure :
J'ai une routine "nomCellules" nommant donc des cellules, qui n'est jamais appelée dans "Deb00". Est ce que cette routine sera exécutée ? J'aurais tendance à dire non mais je ne sais pas vraiment...
Messages postés
12272
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
14 mai 2020
2 423 > maniqk
La routine "nomCellules" sert à nommer les cellules concernées. En l'occurence, elle nomme les cellules de la 1ère ligne de ta feuille active en leur affectant, comme nom, leur contenu.
Cette "routine" ne doit être lancée qu'une seule fois. Si tes cellules sont nommées, une fois le classeur enregistré, et sans modification par un utilisateur, c'est définitif.

Donc, il se peut très bien qu'elle ne soit pas appelée depuis le code et que, par voie de conséquence, elle ne soit pas exécutée.

Cependant, comme la Sub Deb00 fait appelle à des cellules nommées (ex : Range("chemin").Value), il convient de vérifier que ces cellules sont bien nommées. Dans le cas contraire, il faut appeller la Sub nomCellules()

Pour qu'une fonction se déclenche, il faut, soit l'appeler depuis le code, soit qu'elle soit déclenchée par un événement.
Ca marche, merci pour tes réponses pikaju !

J'ai également posté une autre question concernant la compatibilité entre Excel 2003 et 2010, si jamais tu tombes dessus ^_^