Fonctionnement général d'un code VBA...

Résolu
maniqk -  
 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

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Peux tu nous placer, ici même dans une réponse, le code complet de ton Module?
    0
    1. maniqk
       
      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...
      0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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é.
    0
    1. maniqk
       
      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...
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > 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.
        0
    2. maniqk
       
      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 ^_^
      0