Trouver une solution au bug dans la macro

Bonjour le forum
J’utilise la macro suivante pour afficher le contenu d’une ligne tableau structuré selon la valeur (numéro de facture) de la cellule K3 de la feuille active
Le problème qu’il ya un bug indiqué sur le code lorsque la cellule la cel K3 est vide.
Comment ajouter une ligne macro pour tester si la cellule est vide pour sortir de l’execution de la macro du macro
Meci pour votre aide
Cordialement

Sub Duplicata_Facture(ByVal control As IRibbonControl)    'afficher duplicata
Application.ScreenUpdating = False
Dim Sh2 As Worksheet, Sh4 As Worksheet
Dim xLig&, xCol&, i&
Application.ScreenUpdating = False
Set Sh2 = Sheets("archive_factures")        'Source         ==> Feuil2
Set Sh4 = Sheets("Duplicata_facture")       'Destination    ==> Feuil3

Sh4.Unprotect
Sh4.Range("C5:F8,D2,B18:F42,D44:D45").ClearContents
Sh4.Range("C3").MergeArea.ClearContents

xCol = 9
**xLig = Evaluate("MATCH('Duplicata_facture'!K3,archive_factures!A1:A17,0)")**

With Sh2
    Sh4.[C3] = .Range("A" & xLig).Value
    Sh4.[D2] = .Range("B" & xLig).Value
    Sh4.[C5] = .Range("C" & xLig).Value
    Sh4.[C6] = .Range("D" & xLig).Value
    Sh4.[C8] = .Range("E" & xLig).Value
    Sh4.[D44] = .Range("F" & xLig).Value
    Sh4.[D45] = .Range("G" & xLig).Value
    '''Sh4.[D47] = .Range("H" & xLig).Value
    
    '''Sh4.[D36] = .Range("j" & xLig).Value
    
    For i = 18 To 42                        'Copie ==> CODE ARTICLE    DESIGNATION QTITE   PUHT    PRIX TOTAL HT
        .Range(.Cells(xLig, xCol), .Cells(xLig, xCol + 4)).Copy
        Sh4.Range("B" & i & ":F" & i).PasteSpecial Paste:=xlPasteValues
        '''Sh4.Range("A" & i & ":E" & i).PasteSpecial Paste:=xlPasteValues
        xCol = xCol + 5
    Next i
    Call QRCodeDuplic
    Sh4.Range("K3").ClearContents
    Sh4.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End With
Application.ScreenUpdating = True
End Sub
if sheets("Duplicata_facture").range("K3").value="" then msgbox "vide":exit sub
xlig = Evaluate("IFERROR(MATCH('Duplicata_facture'!K3,archive_factures!A1:A17,0),0)")
If xlig = 0 Then MsgBox "erreur": Exit Sub

Bonjour Cow18
Merci pour la réponse, je n’ai pas vu cette deuxième réponse modification de la première.
le première je l’ai essayé avant votre réponse mais ça n’a rien donné.
mais la deuxième impeccable ça marche tés bien j’ai eu 3 solutions aujourd’hui
Bonnesoirée

1 « J'aime »

Bonjour @Cow18,

A) pour la 2ème ligne du code VBA :

  • la référence de plage de cellules archive_factures!A1:A17 est ok.:slightly_smiling_face: il n’y a pas de quotes inutiles (quotes = apostrophes).
  • pour 'Duplicata_facture'!K3 : c’est seulement quand il y a un espace dans le nom que les quotes sont obligatoires ; donc je propose de supprimer les 2 quotes, ce qui donne : Duplicata_facture!K3 ; ainsi, c’est abrégé de 2 caractères, et surtout la notation est plus « homogène » avec archive_factures!A1:A17.

B) pour la 1ère ligne du code VBA :

  • il y a : sheets("Duplicata_facture").range("K3").value
  • je propose d’utiliser cette notation abrégée : [Duplicata_facture!K3] ; juste pour info, les crochets font implicitement appel à la fonction Evaluate() pour évaluer l’expression (qui est donc ici une référence de cellule).
  • ainsi, la ligne VBA complète est :
    If [Duplicata_facture!K3] = "" Then MsgBox "vide": Exit Sub
    donc là aussi, la notation utilisée est plus « homogène » avec les notations précédentes.:slightly_smiling_face:
1 « J'aime »

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.