Les Allergies
Alimentaires
Posez votre question Signaler

Erreur de compilation [Résolu]

bestkeeper 69Messages postés 19 avril 2007Date d'inscription 22 mai 2012Dernière intervention - Dernière réponse le 14 oct. 2008 à 12:08
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.
Lire la suite 

Erreur de compilation »

42 réponses
Réponse
+1
moins plus
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.
Ajouter un commentaire
Réponse
+1
moins plus
Oui c'est bien moi qui ai fait ce code ... mais ça ne devait pas se présenter comme çà ...

;o)
Ajouter un commentaire
Réponse
+1
moins plus
Comment ça "les données de la première page" ???
Ajouter un commentaire
Réponse
+1
moins plus
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.
Ajouter un commentaire
Réponse
+1
moins plus
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
Ajouter un commentaire
Réponse
+1
moins plus
As-tu une erreur ? si oui quel est le message et sur quelle ligne se produit-elle ?
Ajouter un commentaire
Réponse
+1
moins plus
la macro recopie des données de l'onglet "commande" vers l'onglet "recap", je ne vois pas le problème.
Ajouter un commentaire
Réponse
+1
moins plus
peut-être des sauts de page?

J'en ai sur mon onglet commande.
Ajouter un commentaire
Réponse
+0
moins plus
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)
Ajouter un commentaire
Réponse
+0
moins plus
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)
Ajouter un commentaire
Réponse
+0
moins plus
bizarre ... cette ligne n'a rien à voir avec la fonction doesExist qui fonctionnait avant ...

Ce problème vient d'ailleur.

Ajouter un commentaire
Réponse
+0
moins plus
Ne t'embêtes pas, je ferai un tri manuel.

Merci du temps que tu m'as consacré.

Sympa.
Ajouter un commentaire
Réponse
+0
moins plus
Peux tu remettre l'ensemble de ton code ici stp ?

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

Merci

;o)
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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)
Ajouter un commentaire
Réponse
+0
moins plus
Merci beaucoup
Ajouter un commentaire
Réponse
+0
moins plus
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)
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

même soucis sur le Private Sub Prepare tri
Erreur sur la ligne if DoesExist
Ajouter un commentaire
Réponse
+0
moins plus
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)
Ajouter un commentaire
Réponse
+0
moins plus
Le message est le suivant :

Erreur de compilation Sub ou fonction non définie.
Et il signale la ligne indiquée ci-dessus.
Ajouter un commentaire
Ce document intitulé « Erreur de compilation » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?
Erreur de compilation - page 2