Exécution d'une macro selon valeur cellule
Bonjour à tous à nouveau,
Je continue de bosser sur mon projet excel et j'ai à nouveau un petit défi. Bien que mon code d'un simple copier / coller fonctionne, je souhaite à présent faire un check entre le moment où je colle les données copiées dans le presse-papier et celui où les valeurs collées sont validées sur le tableau.
Le code original:
Sub COLLERNOMENCLATURE()
' Cette Macro colle la nomenclature
If Application.ClipboardFormats(1) = -1 Then
MsgBox "LA NOMENCLATURE N'A PAS ÉTÉ COPIÉE!" & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "COPIE LA NOMENCLATURE ET RECOMMENCE.", vbCritical + vbOKOnly, "MESSAGE:"
End
Else
Application.ScreenUpdating = False
' J'ouvre la feuille NOMENCLATURE et je colle depuis A1 la nomenclature copiée depuis l'ERP:
Sheets("NOMENCLATURE").Visible = True
Sheets("NOMENCLATURE").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
' J'applique un filtre sur la colonne P
Range("A1:T1").Select
Selection.AutoFilter
Range("P1").Select
ActiveSheet.Range("$A$1:$T$27").AutoFilter Field:=16, Criteria1:="FAB"
' J'applique un filtre sur la colonne O
Range("A1:T1").Select
Selection.AutoFilter
Range("O1").Select
ActiveSheet.Range("$A$1:$T$27").AutoFilter Field:=15, Criteria1:="Composant"
'Je copie les références, les numéros d'articles et les quantités et les colle dans SCAN
Range("B2:B63").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("SCAN").Select
Range("B8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("NOMENCLATURE").Select
Range("T2:T63").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("SCAN").Select
Range("D8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("NOMENCLATURE").Select
Range("K2:K63").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("SCAN").Select
Range("E8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("NOMENCLATURE").Select
Range("C2:C63").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("SCAN").Select
Range("C8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Je referme la feuille Nomenclature afin qu'elle ne soit pas visible.
Sheets("NOMENCLATURE").Select
ActiveWindow.SelectedSheets.Visible = False
Sheets("NOMENCLATURE").Visible = xlSheetVeryHidden
Sheets("SCAN").Select
End If
Application.ScreenUpdating = True
'Je vide le presse-papier:
Application.CutCopyMode = False
'Je selectionne I8 pour commencer à scanner:
Range("I8").Select
' Message final:
Dim answer As Integer
answer = MsgBox(Range("R3") & ", LA NOMENCLATURE A CORRECTEMENT ÉTÉ COLLÉE. TU PEUX COMMENCER A SCANNER " & Range("I5"), vbInformation + vbOKOnly + vbDefaultButton2, "GESTION DES SCANS:")
If answer = vbOK Then
End If
End SubMaintenant, voici ce que je souhaite faire:
- Coller la nomenclature depuis le presse-papier
- Contrôler que la valeur de AT65 sur l'onglet NOMENCLATURE soit "OK"
- Si OK, continuer avec la macro
- Si KO message d'erreur et retour à l'onglet SCAN.
Voici mon code mais qui ne fonctionne pas !
Sub COLLERNOMENCLATURE()
' Cette Macro colle la nomenclature
If Application.ClipboardFormats(1) = -1 Then
MsgBox "LA NOMENCLATURE N'A PAS ÉTÉ COPIÉE!" & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "COPIE LA NOMENCLATURE ET RECOMMENCE.", vbCritical + vbOKOnly, "MESSAGE:"
End
Else
Application.ScreenUpdating = False
Set target = Range("AT65")
If target.Value = "KO" Then
MsgBox = "Erreur du collage"
Sheets("NOMENCLATURE").Select
ActiveWindow.SelectedSheets.Visible = False
Sheets("NOMENCLATURE").Visible = xlSheetVeryHidden
Sheets("SCAN").Select
End If
Else
If target.Value = "OK" Then
End If
' J'ouvre la feuille NOMENCLATURE et je colle depuis A1 la nomenclature copiée depuis l'ERP:
Sheets("NOMENCLATURE").Visible = True
Sheets("NOMENCLATURE").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
' J'applique un filtre sur la colonne P
Range("A1:T1").Select
Selection.AutoFilter
Range("P1").Select
ActiveSheet.Range("$A$1:$T$27").AutoFilter Field:=16, Criteria1:="FAB"
' J'applique un filtre sur la colonne O
Range("A1:T1").Select
Selection.AutoFilter
Range("O1").Select
ActiveSheet.Range("$A$1:$T$27").AutoFilter Field:=15, Criteria1:="Composant"
'Je copie les références, les numéros d'articles et les quantités et les colle dans SCAN
Range("B2:B63").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("SCAN").Select
Range("B8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("NOMENCLATURE").Select
Range("T2:T63").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("SCAN").Select
Range("D8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("NOMENCLATURE").Select
Range("K2:K63").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("SCAN").Select
Range("E8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("NOMENCLATURE").Select
Range("C2:C63").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("SCAN").Select
Range("C8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Je referme la feuille Nomenclature afin qu'elle ne soit pas visible.
Sheets("NOMENCLATURE").Select
ActiveWindow.SelectedSheets.Visible = False
Sheets("NOMENCLATURE").Visible = xlSheetVeryHidden
Sheets("SCAN").Select
End If
Application.ScreenUpdating = True
'Je vide le presse-papier:
Application.CutCopyMode = False
'Je selectionne I8 pour commencer à scanner:
Range("I8").Select
' Message final:
Dim answer As Integer
answer = MsgBox(Range("R3") & ", LA NOMENCLATURE A CORRECTEMENT ÉTÉ COLLÉE. TU PEUX COMMENCER A SCANNER " & Range("I5"), vbInformation + vbOKOnly + vbDefaultButton2, "GESTION DES SCANS:")
If answer = vbOK Then
End If
End SubJ'ai donc rajouter cette partie:
Set target = Range("AT65")
If target.Value = "KO" Then
Sheets("NOMENCLATURE").Select
ActiveWindow.SelectedSheets.Visible = False
Sheets("NOMENCLATURE").Visible = xlSheetVeryHidden
Sheets("SCAN").Select
MsgBox = "Erreur du collage. Merci de recommencer"
End If
Else
If target.Value = "OK" Then
End IfVoici le message d'erreur:
Je reste bien entendu à dispo pour tout complément d'information.
Merci.
Pat.
Bonjour BrunoM45,
voici un fichier très simplifié de l'original car l'autre à des infos que je ne peux publier.
Merci pour ton aide.
Bonjour PatPatrouille
Le problème ce situe ICI
Tu ne peux pas attribuer un = texte à un MsgBox, seulement comme ceci
Msgbox "Erreur de collage"Voici le code optimisé
' Cette Macro colle la nomenclature
Sub COLLERNOMENCLATURE()
' Définir les variables
Dim ShtS As Worksheet
'Dim ShtN as Worksheet
Dim Cel As Range
' Affecter l'objet feuille
Set ShtS = ThisWorkbook.Sheets("SCAN")
'Set ShtN = ThisWorkbook.Sheets("NOMENCLATURE")
'
If Application.ClipboardFormats(1) = -1 Then
MsgBox "LA NOMENCLATURE N'A PAS ÉTÉ COPIÉE!" & vbCr & vbCr _
& "COPIE LA NOMENCLATURE ET RECOMMENCE.", vbCritical + vbOKOnly, "GESTION DES SCANS:"
Exit Sub
End If
Application.ScreenUpdating = False
ShtS.Rows("7:71").EntireRow.Hidden = False
' J'ouvre la feuille NOMENCLATURE et je colle depuis l'ERP:
With Sheets("NOMENCLATURE")
.Visible = True
.Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Set Cel = .Range("AT65")
If Cel.Value = "KO" Then
MsgBox "Erreur du collage"
.Visible = xlSheetVeryHidden
Else
' J'applique un filtre sur la colonne P
.Range("A1:T1").AutoFilter
.Range("$A$1:$T$27").AutoFilter Field:=16, Criteria1:="FAB"
' J'applique un filtre sur la colonne O
.Range("$A$1:$T$27").AutoFilter Field:=15, Criteria1:="Composant"
'Je copie les réferences, les numéros d'articles et les quantités et les colle dans SCAN
.Range("B2:B63").Copy
ShtS.Range("B8").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Sheets("NOMENCLATURE").Select
.Range("T2:T63").Copy
ShtS.Range("D8").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
.Range("K2:K63").Copy
ShtS.Range("E8").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
.Range("C2:C63").Copy
ShtS.Range("C8").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
' Je referme la feuille Nomenclature afin qu'elle ne soit pas visible.
.Visible = xlSheetVeryHidden
'Je vide le presse-papier:
Application.CutCopyMode = False
'Je selectionne I8 pour commencer à scanner:
Range("I8").Select
' Message final
If MsgBox(Range("R3") & ", LA NOMENCLATURE A CORRECTEMENT ÉTÉ COLLÉE. TU PEUX COMMENCER A SCANNER L'OF " _
& Range("I5"), vbInformation + vbOKOnly + vbDefaultButton2, "GESTION DES SCANS:") = vbOK Then
End If
End If
End With
Application.ScreenUpdating = True
End SubA+
Bonjour BrunoM45,
Tout d'abord un très grand merci pour ton retour et l'optimisation du code avec les variables. Beaucoup plus propre, beaucoup plus pro.
Il fonctionne bien. Si AT65 est OK tout se déroule correctement. En revanche, si AT65 marque KO il affiche bien le message d'erreur, il ne colle pas dans l'onglet "scan" mais il exécute le reste du code dont ShtS.Rows("7:71").EntireRow.Hidden = False
En fait, si AT65 est KO il faut le message d'erreur et retour sur l'onglet SCAN sans aucune autre action. Si AT65 est OK il faut exécuter le reste de la macro.
Je veux bien t'envoyer en privé le code complet si tu es bien d'accord.
Merci.
Salut PatPatrouille
mais il exécute le reste du code
Je ne comprends pas, le code exécuté est celui entre le If et le Else
Ne veut tu pas dire plutôt qu'il "doit exécuter" si KO !?
Merci de déposer ICI le fichier avec le code complet
A+
Re, et re-merci :-)
Voici à nouveau le fichier avec le code complet.
Pour te situer, si KO dans AT65 (Nomenclature) le reste du code ne doit pas être exécuté sauf bien entendu le message d'erreur. Hors, avec le code inclus dans le fichier, le message d'erreur apparaît et tout le reste du code est exécuté (sauf le collage depuis nomenclature à Scan).
Je souhaiterais te remercier pour ton aide. Je t'écrirai donc en MP pour cela.
Encore merci
Pat.
C'est tout bon, ça fonctionne parfaitement bien.
Merci une fois de plus pour ce petit cours d'optimisation avec les variantes :-) Je ne connaissais pas cela.
Petit message en privé pour te remercier.