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. Quelqu'un peut m'aider SVP.

    Je suis bloqué.
    -1
    1. bonjour

      myTab() doit être déclaré en variable global du module et non dans une procédure.

      Tu as "Sub Bouton1_QuandClic()" qui n'a rien à faire ici puisque pas de End Sub.

      Idem pourquoi 2 fois End Function à la fin ????

      ;o)
      -1
      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. J'ai apporté les modifications.
            Le hic, est que cela ne me prends en compte que les données de la première page.
            -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. Il faut modifier l'objet Worksheets().

                  Faire : Set ws = Worksheets("nom_de_l'onglet") ou lieu de Worksheets(1) par exemple.

                  ;o)
                  -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. Tu dois faire pareil dans lanceRecap() pour ws1 (onglet origine) et ws2 (onglet destination)
                      -1
                      1. ça ne marche toujours pas.

                        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

                        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

                        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. Je n'ai pas d'erreur.
                            La macro s'execute, et seules les données de la première page de l'onglet "commande" apparaissent.
                            -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. C'est à cause des cellules fusionnées ou vides ... le test se fait sur la colonne A. Pour parcourir toute la feuille, il ne faut ni cellules vides en A, ni cellules fusionnées.
                                  -1
                                  1. Ok, donc moi j'ai des cellules vides.

                                    Je fais un test avec uniquement des cellules pleines, et je te tiens au courant.

                                    Merci
                                    -1
                                    1. ça marche en supprimant les cellules vides.

                                      Cependant, la récap ne me tri pas les références article par ordre alphabétique.
                                      Cela serait plus facile à la lecture.

                                      Merci
                                      -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
                                        • 2
                                        • 3