Erreur de compilation
Résoluj'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
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.
-
Quelqu'un peut m'aider SVP.
Je suis bloqué. -
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) -
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. -
Oui c'est bien moi qui ai fait ce code ... mais ça ne devait pas se présenter comme çà ...
;o) -
J'ai apporté les modifications.
Le hic, est que cela ne me prends en compte que les données de la première page. -
Comment ça "les données de la première page" ???
-
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. -
Il faut modifier l'objet Worksheets().
Faire : Set ws = Worksheets("nom_de_l'onglet") ou lieu de Worksheets(1) par exemple.
;o) -
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 -
Tu dois faire pareil dans lanceRecap() pour ws1 (onglet origine) et ws2 (onglet destination)
-
ç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 -
As-tu une erreur ? si oui quel est le message et sur quelle ligne se produit-elle ?
-
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. -
la macro recopie des données de l'onglet "commande" vers l'onglet "recap", je ne vois pas le problème.
-
peut-être des sauts de page?
J'en ai sur mon onglet commande. -
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.
-
Ok, donc moi j'ai des cellules vides.
Je fais un test avec uniquement des cellules pleines, et je te tiens au courant.
Merci -
ok
;o) -
ç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 -
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)
- 1
- 2
- 3