Erreur de compilation

Résolu
Bonjour,

j'ai une erreur dans ma macro "erreur de compilation, variable non définie" sur la ligne ReDim Preserve my tab

Voici la macro :

Sub Bouton1_QuandClic()

Private myTab()
Private ind As Long

Public Sub mainTri()

prepareTri
lanceRecap

End Sub

Private Sub prepareTri()
Dim ws As Worksheet
Dim i As Long

Set ws = Worksheets(1)
i = 2
While ws.Range("A" & i).Value <> ""
If doesExist(ws.Range("A" & i).Value) = False Then
ind = ind + 1
ReDim Preserve myTab(ind)
myTab(ind) = ws.Range("A" & i).Value
End If
i = i + 1
Wend

Set ws = Nothing

End Sub

Private Sub lanceRecap()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim lig1 As Long
Dim lig2 As Long
Dim i As Long
Dim str As Variant

Set ws1 = Worksheets(1)
Set ws2 = Worksheets(2)
lig2 = 2

For i = 1 To ind
lig1 = 2
str = myTab(i)
While ws1.Range("A" & lig1).Value <> ""
If ws1.Range("A" & lig1).Value = str Then
ws1.Range("B" & lig1).Copy Destination:=ws2.Range("A" & lig2)
ws1.Range("A" & lig1).Copy Destination:=ws2.Range("B" & lig2)
ws1.Range("E" & lig1).Copy Destination:=ws2.Range("C" & lig2)
lig2 = lig2 + 1
End If
lig1 = lig1 + 1
Wend
Next i

Set ws1 = Nothing
Set ws2 = Nothing

End Sub

Private Function doesExist(ByVal str As Variant) As Boolean
Dim i As Long

For i = 1 To ind
If myTab(i) = str Then
doesExist = True
Exit Function
End If
Next i

doesExist = False

End Function

End Function

Help SVP.

Cette macro me sert à effectuer un récapitulatif de commande.
Configuration: Windows XP
Internet Explorer 6.0

42 réponses

Résumé de la discussion

Le problème central est une erreur de compilation 'variable non définie' sur la ligne ReDim Preserve myTab dans une macro VBA destinée à récapituler des commandes. Plusieurs échanges pointent vers la gestion du tableau myTab et la nécessité d'initier et déclarer toutes les variables (Option Explicit), ainsi que d'ajuster les noms des feuilles. D'autres commentaires proposent des versions alignées sur les feuilles 'commandes' et 'recap', et mentionnent des appels de routine comme TriTab ou Call TriTab, susceptibles d'engendrer des erreurs si non définis. En cas d'évolution du fil, certains évoquent la vérification de l'initialisation de ind et l'usage cohérent des noms de feuilles, ainsi que l'éventuelle suppression des appels de procédure non présents.

Bobot (l’IA à votre service)
  1. Désolé mais je n'y comprends rien.

    Il me semble que c'est toi qui avait écrit la macro, et j'ai du faire une erreur en la recopiant.
    1
    1. Oui c'est bien moi qui ai fait ce code ... mais ça ne devait pas se présenter comme çà ...

      ;o)
      1
      1. Comment ça "les données de la première page" ???
        1
        1. En fait dans mon premier onglet "commande", je crée une page par commande fournisseur.

          Et la macro ne prends en compte que les données de la première page.

          en espérant être assez clair.
          1
          1. Voici ce que j'ai écrit.
            Et toujours le même problème

            Option Explicit

            Private myTab()
            Private ind As Long

            Public Sub mainTri()

            prepareTri
            lanceRecap

            End Sub

            Private Sub prepareTri()
            Dim ws As Worksheet
            Dim i As Long

            Set ws = Worksheets("commandes")
            i = 2
            While ws.Range("A" & i).Value <> ""
            If doesExist(ws.Range("A" & i).Value) = False Then
            ind = ind + 1
            ReDim Preserve myTab(ind)
            myTab(ind) = ws.Range("A" & i).Value
            End If
            i = i + 1
            Wend

            Set ws = Nothing

            End Sub

            Private Sub lanceRecap()
            Dim ws1 As Worksheet
            Dim ws2 As Worksheet
            Dim lig1 As Long
            Dim lig2 As Long
            Dim i As Long
            Dim str As Variant

            Set ws1 = Worksheets(1)
            Set ws2 = Worksheets(2)
            lig2 = 2

            For i = 1 To ind
            lig1 = 2
            str = myTab(i)
            While ws1.Range("A" & lig1).Value <> ""
            If ws1.Range("A" & lig1).Value = str Then
            ws1.Range("B" & lig1).Copy Destination:=ws2.Range("A" & lig2)
            ws1.Range("A" & lig1).Copy Destination:=ws2.Range("B" & lig2)
            ws1.Range("E" & lig1).Copy Destination:=ws2.Range("C" & lig2)
            lig2 = lig2 + 1
            End If
            lig1 = lig1 + 1
            Wend
            Next i

            Set ws1 = Nothing
            Set ws2 = Nothing

            End Sub

            Private Function doesExist(ByVal str As Variant) As Boolean
            Dim i As Long

            For i = 1 To ind
            If myTab(i) = str Then
            doesExist = True
            Exit Function
            End If
            Next i

            doesExist = False

            End Function
            1
            1. As-tu une erreur ? si oui quel est le message et sur quelle ligne se produit-elle ?
              1
              1. la macro recopie des données de l'onglet "commande" vers l'onglet "recap", je ne vois pas le problème.
                1
                1. peut-être des sauts de page?

                  J'en ai sur mon onglet commande.
                  1
                  1. Regarde si ça fonctionne, je n'ai pas pu tester

                    Private Sub lanceRecap()
                    Dim ws1 As Worksheet
                    Dim ws2 As Worksheet
                    Dim lig1 As Long
                    Dim lig2 As Long
                    Dim i As Long
                    Dim str As Variant
                     
                       Set ws1 = Worksheets("commandes")
                       Set ws2 = Worksheets("recap")
                       lig2 = 2
                    
                       Call TriTab(True)   'True tri croissant, False tri décroissant
                    
                       For i = 1 To ind
                          lig1 = 2
                         str = myTab(i)
                        While ws1.Range("A" & lig1).Value <> ""
                           If ws1.Range("A" & lig1).Value = str Then
                              ws1.Range("B" & lig1).Copy Destination:=ws2.Range("A" & lig2)
                              ws1.Range("A" & lig1).Copy Destination:=ws2.Range("B" & lig2)
                              ws1.Range("E" & lig1).Copy Destination:=ws2.Range("C" & lig2)
                              lig2 = lig2 + 1
                          End If
                          lig1 = lig1 + 1
                       Wend
                      Next i 
                    
                    Set ws1 = Worksheets("commandes")
                    Set ws2 = Worksheets("recap")
                    
                    End Sub 
                    
                    Sub TriTab(bASC As Boolean)
                        Dim i As Long, j As Long
                        Dim Temp As String
                        
                        If bASC Then    '  croissant
                            For i = LBound(myTab()) To UBound(myTab()) - 1
                                For j = i + 1 To UBound(myTab())
                                    If myTab(i) > myTab(j) Then
                                        Temp = myTab(j)
                                        myTab(j) = myTab(i)
                                        myTab(i) = Temp
                                    End If
                                Next j
                            Next i
                        Else            ' décroissant
                            For i = LBound(myTab()) To UBoundmyTab()) - 1
                                For j = i + 1 To UBound(myTab())
                                    If myTab(i) < myTab(j) Then
                                        Temp = myTab(j)
                                        myTab(j) = myTab(i)
                                        myTab(i) = Temp
                                    End If
                                Next j
                            Next i
                        End If
                    End Sub
                    


                    ;o)
                    0
                    1. Non.

                      j'ai une erreur ici

                      Private Sub prepareTri()
                      Dim ws As Worksheet
                      Dim i As Long

                      Set ws = Worksheets("commandes")
                      i = 2
                      While ws.Range("A" & i).Value <> ""
                      If doesExist(ws.Range("A" & i).Value) = False Then (sur le doesExist)
                      0
                      1. bizarre ... cette ligne n'a rien à voir avec la fonction doesExist qui fonctionnait avant ...

                        Ce problème vient d'ailleur.

                        0
                        1. Ne t'embêtes pas, je ferai un tri manuel.

                          Merci du temps que tu m'as consacré.

                          Sympa.
                          0
                          1. Peux tu remettre l'ensemble de ton code ici stp ?

                            J'aimerai comprendre pourquoi cela ne fonctionne pas ...

                            Merci

                            ;o)
                            0
                            1. Voici l'ensemble du code.

                              Petite question, la macro ne fonctionne pas si j'ajoute dans ma récap une colonne dans laquelle j'ai une formule du type SI(ESTNA...
                              En fait cela me copie la formul et non le résultat.

                              Option Explicit

                              Private myTab()
                              Private ind As Long

                              Public Sub mainTri()

                              prepareTri
                              lanceRecap

                              End Sub

                              Private Sub prepareTri()
                              Dim ws As Worksheet
                              Dim i As Long

                              Set ws = Worksheets("commandes")
                              i = 2
                              While ws.Range("A" & i).Value <> ""
                              If doesExist(ws.Range("A" & i).Value) = False Then
                              ind = ind + 1
                              ReDim Preserve myTab(ind)
                              myTab(ind) = ws.Range("A" & i).Value
                              End If
                              i = i + 1
                              Wend

                              Set ws = Nothing

                              End Sub

                              Private Sub lanceRecap()
                              Dim ws1 As Worksheet
                              Dim ws2 As Worksheet
                              Dim lig1 As Long
                              Dim lig2 As Long
                              Dim i As Long
                              Dim str As Variant

                              Set ws1 = Worksheets("commandes")
                              Set ws2 = Worksheets("recap")
                              lig2 = 2

                              Call TriTab(True) 'True tri croissant, False tri décroissant

                              For i = 1 To ind
                              lig1 = 2
                              str = myTab(i)
                              While ws1.Range("A" & lig1).Value <> ""
                              If ws1.Range("A" & lig1).Value = str Then
                              ws1.Range("B" & lig1).Copy Destination:=ws2.Range("A" & lig2)
                              ws1.Range("A" & lig1).Copy Destination:=ws2.Range("B" & lig2)
                              ws1.Range("E" & lig1).Copy Destination:=ws2.Range("C" & lig2)
                              lig2 = lig2 + 1
                              End If
                              lig1 = lig1 + 1
                              Wend
                              Next i

                              Set ws1 = Worksheets("commandes")
                              Set ws2 = Worksheets("recap")

                              End Sub

                              Sub TriTab(bASC As Boolean)
                              Dim i As Long, j As Long
                              Dim Temp As String

                              If bASC Then ' croissant
                              For i = LBound(myTab()) To UBound(myTab()) - 1
                              For j = i + 1 To UBound(myTab())
                              If myTab(i) > myTab(j) Then
                              Temp = myTab(j)
                              myTab(j) = myTab(i)
                              myTab(i) = Temp
                              End If
                              Next j
                              Next i
                              Else ' décroissant
                              For i = LBound(myTab()) To UBoundmyTab()) - 1
                              For j = i + 1 To UBound(myTab())
                              If myTab(i) < myTab(j) Then
                              Temp = myTab(j)
                              myTab(j) = myTab(i)
                              myTab(i) = Temp
                              End If
                              Next j
                              Next i
                              End If
                              End Sub
                              0
                              1. J'ai fait une petite erreur en bas de la Sub LanceRecap(), il faut remplacer :

                                Set ws1 = Worksheets("commandes")
                                Set ws2 = Worksheets("recap")

                                par

                                Set ws1 = Nothing
                                Set ws2 = Nothing

                                mais ça n'a aucune influence sur le code.

                                Je ne vois pas d'autres erreurs suceptibles de l'empêcher de tourner.

                                Quant à la recopie de la formule à la place du résultat, je ne sais pas trop, il faut que je regarde dans l'aide. Je regarderai demain et je te dis si j'ai trouvé quelque chose.

                                Bonne soirée.

                                ;o)
                                0
                                1. Bonjour,

                                  Voilà comment copier les valeurs et non les formules :
                                  Private Sub lanceRecap()
                                  Dim ws1 As Worksheet
                                  Dim ws2 As Worksheet
                                  Dim lig1 As Long
                                  Dim lig2 As Long
                                  Dim i As Long
                                  Dim str As Variant
                                  
                                  Set ws1 = Worksheets("commandes")
                                  Set ws2 = Worksheets("recap")
                                  lig2 = 2
                                  
                                  Call TriTab(True) 'True tri croissant, False tri décroissant
                                  
                                      For i = 1 To ind
                                      lig1 = 2
                                      str = myTab(i)
                                      While ws1.Range("A" & lig1).Value <> ""
                                          If ws1.Range("A" & lig1).Value = str Then
                                              ws1.Select
                                              ws1.Range("B" & lig1).Copy
                                              ws2.Select
                                              ws2.Range("A" & lig2).Select
                                              Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                                              ws1.Select
                                              ws1.Range("A" & lig1).Copy
                                              ws2.Select
                                              ws2.Range("B" & lig2).Select
                                              Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                                              ws1.Select
                                              ws1.Range("E" & lig1).Copy
                                              ws2.Select
                                              ws2.Range("C" & lig2).Select
                                              Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                                              lig2 = lig2 + 1
                                          End If
                                      lig1 = lig1 + 1
                                      Wend
                                      Next i
                                  
                                  Set ws1 = Nothing
                                  Set ws2 = Nothing
                                  
                                  End Sub
                                  


                                  ;o)
                                  0
                                  1. Bonjour,

                                    même soucis sur le Private Sub Prepare tri
                                    Erreur sur la ligne if DoesExist
                                    0
                                    1. C'est erreur de ne vient pas de ce code ... la fonction doesExist() fonctionnée avant et celle-ci n'a rien à voir avec. Le problème est ailleur.

                                      ;o)
                                      0
                                      1. Le message est le suivant :

                                        Erreur de compilation Sub ou fonction non définie.
                                        Et il signale la ligne indiquée ci-dessus.
                                        0
                                        • 1
                                        • 2
                                        • 3