Débutant VBA erreur de compilation

Résolu/Fermé
Le débutant - 7 nov. 2010 à 19:49
 Le débutant - 9 nov. 2010 à 14:01
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 :)


4 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
9 nov. 2010 à 11:22
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

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


1
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 9/11/2010 à 08:54
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 :
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 --
0
Le débutant
9 nov. 2010 à 10:32
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é :)
0
Le débutant
9 nov. 2010 à 12:37
Merci beaucoup à tous les deux.
Je ne connaissais pas cette méthode, c'est parfait !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 9/11/2010 à 13:00
Salut,
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.
0
Le débutant
9 nov. 2010 à 14:01
J'adore ce forum :))))

Merci à tous les deux et à bientôt
0