Débutant VBA erreur de compilation
Résolu
Le débutant
-
Le débutant -
Le débutant -
Bonjour,
Je souhaite archiver mes factures une fois terminées. La fonction ci-dessous fonctionne pour cela.
Maintenant, je souhaite qu'Excel me réponde "facture déjà archivée" si elles le sont déjà, et ne fasse rien.
Et quand elles ne le sont pas, qu'il les archives (j'ai enlevé la procédure pour ne pas alourdir le code, mais elle fonctionne) et termine en me disant "archivage effectué".
Or, avec mon code, il archive la facture même si elle l'est déjà et me donne les deux messages précédents à la suite.
Auriez-vous une idée de l'origine de mon erreur ?
Merci beaucoup par avance pour votre aide:
Sub archive()
Application.ScreenUpdating = False
Dim Plage As Range
Dim Cellule As Range
On Error Resume Next
Set Plage = Sheets("liste_facture").Range(Cells(1, 1), Cells(1, 60000))
For Each Cellule In Plage
If Cellule.Value = "nf" Then
Result = MsgBox("Archivage déjà effectué", vbOKOnly + vbExclamation, "Attention")
If Cellule.Value<>"nf" Then
OPERATION D'ARCHIVAGE (je ne l'ai pas mise car elle fonctionne seule)
Result = MsgBox("Archivage effectué", vbOKOnly + vbInformation, "Terminé")
End If
End If
Next
Application.ScreenUpdating = True
End Sub
Merci pour votre aide :)
Je souhaite archiver mes factures une fois terminées. La fonction ci-dessous fonctionne pour cela.
Maintenant, je souhaite qu'Excel me réponde "facture déjà archivée" si elles le sont déjà, et ne fasse rien.
Et quand elles ne le sont pas, qu'il les archives (j'ai enlevé la procédure pour ne pas alourdir le code, mais elle fonctionne) et termine en me disant "archivage effectué".
Or, avec mon code, il archive la facture même si elle l'est déjà et me donne les deux messages précédents à la suite.
Auriez-vous une idée de l'origine de mon erreur ?
Merci beaucoup par avance pour votre aide:
Sub archive()
Application.ScreenUpdating = False
Dim Plage As Range
Dim Cellule As Range
On Error Resume Next
Set Plage = Sheets("liste_facture").Range(Cells(1, 1), Cells(1, 60000))
For Each Cellule In Plage
If Cellule.Value = "nf" Then
Result = MsgBox("Archivage déjà effectué", vbOKOnly + vbExclamation, "Attention")
If Cellule.Value<>"nf" Then
OPERATION D'ARCHIVAGE (je ne l'ai pas mise car elle fonctionne seule)
Result = MsgBox("Archivage effectué", vbOKOnly + vbInformation, "Terminé")
End If
End If
Next
Application.ScreenUpdating = True
End Sub
Merci pour votre aide :)
A voir également:
- Débutant VBA erreur de compilation
- Erreur 0x80070643 - Accueil - Windows
- Erreur 4201 france tv ✓ - Forum Réseaux sociaux
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
4 réponses
Bonjour,
S'cusez l'incruste, je passais dans le coin et j'ai vu de la lumière...
début de la macro( le principe est le même) pour la feuille détail_facture). la variable "result" est inutile
S'cusez l'incruste, je passais dans le coin et j'ai vu de la lumière...
début de la macro( le principe est le même) pour la feuille détail_facture). la variable "result" est inutile
Sub archive() dim cellule as range Dim ligvid as integer Application.ScreenUpdating = False If Application.CountIf(Sheets("liste_facture").Range("A2:A1000"), Range("nf")) > 0 Then MsgBox "Archivage déjà effectué", vbOKOnly + vbExclamation, "Attention" Else With Sheets("liste_facture") ligvid = .Range("A1000").End(xlUp).Row + 1 .Cells(ligvid, 1) = Range("nf") .Cells(ligvid, 2) = Range("nc") .Cells(ligvid, 3) = Range("date_facture") End With ''//FIN DE PROCEDURE POUR LA FEUILLE liste_facture
Salut,
Qu'est ce que "nf"?
Est ce que : nf est inscrit dans les cellules à tester ou nf est une variable?
Range(Cells(1, 1), Cells(1, 60000)) équivaut à A1:ZZA1
Si tu veux A1:A60000 : Range(Cells(1, 1), Cells(60000, 1))
Déjà modifie ceci :
Cordialement,
-- Il n'y a rien de tel qu'une question idiote, seulement une réponse idiote. A.Einstein --
Qu'est ce que "nf"?
Est ce que : nf est inscrit dans les cellules à tester ou nf est une variable?
Range(Cells(1, 1), Cells(1, 60000)) équivaut à A1:ZZA1
Si tu veux A1:A60000 : Range(Cells(1, 1), Cells(60000, 1))
Déjà modifie ceci :
Sub archive() Application.ScreenUpdating = False Dim Plage As Range Dim Cellule As Range On Error Resume Next 'cette ligne sert à quoi??? Set Plage = Sheets("liste_facture").Range(Cells(1, 1), Cells(60000, 1)) For Each Cellule In Plage If Cellule.Value = "nf" Then Result = MsgBox("Archivage déjà effectué", vbOKOnly + vbExclamation, "Attention") Else 'pas besoin de 2ème test... OPERATION D'ARCHIVAGE (je ne l'ai pas mise car elle fonctionne seule) Result = MsgBox("Archivage effectué", vbOKOnly + vbInformation, "Terminé") End If Next Application.ScreenUpdating = True End Sub
Cordialement,
-- Il n'y a rien de tel qu'une question idiote, seulement une réponse idiote. A.Einstein --
Merci Pijaku pour ton aide. "nf" est le nom que j'ai donné à la cellule contenant le numéro de la facture en cours.
C'est la clé qui me permet de vérifier si la facture est déjà archivée ou non sur la feuille "liste_facture".
En ce qui concerne le "Else", j'ai essayé comme tu m'a conseillé, ça n'effectue que la première opération "Archivage déjà effectué" et ça ne fait rien d'autre même si la facture n'est pas archivée.
Ci-dessous j'ai joint le fichier Excel, tu auras accès au code en entier, ce sera surement plus clair:
http://www.cijoint.fr/cjlink.php?file=cj201011/cijVZVqdK2.xls
Merci beaucoup dans tous les cas et merci pour la plage, je m'étais effectivement trompé :)
C'est la clé qui me permet de vérifier si la facture est déjà archivée ou non sur la feuille "liste_facture".
En ce qui concerne le "Else", j'ai essayé comme tu m'a conseillé, ça n'effectue que la première opération "Archivage déjà effectué" et ça ne fait rien d'autre même si la facture n'est pas archivée.
Ci-dessous j'ai joint le fichier Excel, tu auras accès au code en entier, ce sera surement plus clair:
http://www.cijoint.fr/cjlink.php?file=cj201011/cijVZVqdK2.xls
Merci beaucoup dans tous les cas et merci pour la plage, je m'étais effectivement trompé :)
Salut,
Voici en retour ton fichier avec une troisième variante utilisant la méthode .find :
Merci à Michel_m pour le coup de main.
Voici en retour ton fichier avec une troisième variante utilisant la méthode .find :
Dim Trouve As Range Dim Valeur_cherchee, Valeur_trouvee As String Dim PremiereLigneVide As Integer Application.ScreenUpdating = False 'Détermination de la valeur à rechercher dans liste_facture, soit le N° de facture Valeur_cherchee = Sheets("facture").Range("B8").Value 'procédure de recherche du numéro de facture Set Trouve = Sheets("liste_facture").Columns(1).Cells.Find(what:=Valeur_cherchee) 'Si la procédure ne trouve pas le num de fact (= facture non archivée) If Trouve Is Nothing Then ''//DEBUT DE PROCEDURE POUR LA FEUILLE liste_facture With Sheets("liste_facture") 'détermination du numéro de la première ligne vide PremiereLigneVide = .Cells(65536, 1).End(xlUp).Offset(1, 0).Row 'Dans la première colonne, j'affecte le numéro de facture désignée feuille facture .Cells(PremiereLigneVide, 1).Value = Sheets("facture").Range("B8").Value 'Dans la deuxième colonne, j'affecte la valeur du numéro client .Cells(PremiereLigneVide, 2).Value = Sheets("facture").Range("B9").Value 'Dans la troisième colonne, j'affecte la valeur de date_facture .Cells(PremiereLigneVide, 3).Value = Sheets("facture").Range("F1").Value End With ''//FIN DE PROCEDURE POUR LA FEUILLE liste_facture
Merci à Michel_m pour le coup de main.