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. De rien, c'est avec plaisir.
    N'oublie pas de mettre résolu.

    Bonne continuation et bon courage.

    ;o)
    -1
    1. C'est bon ça marche.
      Merci mille fois Polux 31, pour ton aide plus que précieuse et le temps que tu m'as consacré.

      A bientôt et bonne continuation
      -1
      1. tu peux la coller même après doesExist(), l'emplacement n'a pas d'importance, le tout c'est qu'elle y soit ;o)
        -1
        1. Je la colle après la lanceRecap?
          0
          1. Il manque la procédure TriTab() ... :o|

            0
            1. Voici la macro dans sa globalité, peut-être y verras tu une erreur ?

              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.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

              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
              0
              1. Erreur de compilation sur cette ligne :

                Call TriTab(True)


                Je ne comprends pas, j'ai testé les procédures hier soir chez moi et ça fonctionnait, je pouvais faire le tri dans les 2 sens. Je ne vois pas d'où ça peut venir.
                0
                1. Ok autant pour moi, j'avais zappé cette partie de la macro.
                  Maintenant il me sort une erreur de compilation sur le Private Sub lanceRecap() à la ligne CallTriTab.
                  0
                  1. peu importe, elle doit être dans le même module.
                    0
                    1. dans le dernier ensemble de ton code, la fonction doesExist() n'y est pas ... ne l'aurais-tu pas effacée ???

                      ;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. 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. Bonjour,

                            même soucis sur le Private Sub Prepare tri
                            Erreur sur la ligne if DoesExist
                            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. 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. 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. Peux tu remettre l'ensemble de ton code ici stp ?

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

                                    Merci

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

                                      Merci du temps que tu m'as consacré.

                                      Sympa.
                                      0
                                      • 1
                                      • 2
                                      • 3