J'ai un fichier Excel dans lequel je veux que les gens remplissent des informations spécifiques. Je souhaite rendre obligatoire une plage de cellules d'une ligne si la première cellule de la ligne est remplie. Par exemple, si la cellule A7 est remplie, les cellules B7-07 doivent être renseignées. Et cela se répète jusqu'à ce qu'il y ait une cellule dans la colonne A qui n'est pas renseignée.
J'ai essayé quelques codages VBA pas très bons ici
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Sheets("Sheet1").Range("A7").Value <> "" And Sheets("Sheet1").Range("B7").Value = "" Or Range("C7").Value = "" Or Range("D7").Value = "" Or Range("E7").Value = "" Or Range("F7").Value = "" Or Range("G7").Value = "" Or Range("H7").Value = "" Or Range("I7").Value = "" Or Range("J7").Value = "" Or Range("K7").Value = "" Or Range("L7").Value = "" Or Range("M7").Value = "" Or Range("N7").Value = "" Or Range("O7").Value = "" Then
MsgBox "Alla celler i en rad måste vara ifyllda för att du skall kunna spara. Kontrollera detta och spara igen."
Cancel = True
ElseIf Sheets("Sheet1").Range("A8").Value <> "" And Sheets("Sheet1").Range("B8").Value = "" Or Range("C8").Value = "" Or Range("D8").Value = "" Or Range("E8").Value = "" Or Range("F8").Value = "" Or Range("G8").Value = "" Or Range("H8").Value = "" Or Range("I8").Value = "" Or Range("J8").Value = "" Or Range("K8").Value = "" Or Range("L8").Value = "" Or Range("M8").Value = "" Or Range("N8").Value = "" Or Range("O8").Value = "" Then
MsgBox "Alla celler i en rad måste vara ifyllda för att du skall kunna spara. Kontrollera detta och spara igen."
Cancel = True
ElseIf Sheets("Sheet1").Range("A9").Value <> "" And Sheets("Sheet1").Range("B9").Value = "" Or Range("C9").Value = "" Or Range("D9").Value = "" Or Range("E9").Value = "" Or Range("F9").Value = "" Or Range("G9").Value = "" Or Range("H9").Value = "" Or Range("I9").Value = "" Or Range("J9").Value = "" Or Range("K9").Value = "" Or Range("L9").Value = "" Or Range("M9").Value = "" Or Range("N9").Value = "" Or Range("O9").Value = "" Then
MsgBox "Alla celler i en rad måste vara ifyllda för att du skall kunna spara. Kontrollera detta och spara igen."
Cancel = True
End If
End Sub
Cela fonctionne jusqu'à ce que j'arrive à:
ElseIf Sheets("Sheet1").Range("A9").Value <> "" And Sheets("Sheet1").Range("B9").Value = "" Or Range("C9").Value = "" Or Range("D9").Value = "" Or Range("E9").Value = "" Or Range("F9").Value = "" Or Range("G9").Value = "" Or Range("H9").Value = "" Or Range("I9").Value = "" Or Range("J9").Value = "" Or Range("K9").Value = "" Or Range("L9").Value = "" Or Range("M9").Value = "" Or Range("N9").Value = "" Or Range("O9").Value = "" Then
MsgBox "Alla celler i en rad måste vara ifyllda för att du skall kunna spara. Kontrollera detta och spara igen."
Cancel = True
End If
Ensuite, la MsgBox apparaît même si A9 n’est pas renseigné.
Je sais que ce n’est pas la meilleure façon de réaliser ce que je veux mais c’est ce que j’ai trouvé. Des suggestions pour un meilleur code?
microsoft-excel
vba
Stax82
la source
la source
Sheets("Sheet1").Range("B9").Value = "" Or Range("C9").Value = "" Or Range("D9").Value = "" Or Range("E9").Value = "" Or Range("F9").Value = "" Or Range("G9").Value = "" Or Range("H9").Value = "" Or Range("I9").Value = "" Or Range("J9").Value = "" Or Range("K9").Value = "" Or Range("L9").Value = "" Or Range("M9").Value = "" Or Range("N9").Value = "" Or Range("O9").Value = ""
vous pouvez utiliserWorksheetfunction.countif(Sheets("Sheet1").Range("B9:O9"),"=")=0
Sheets("Sheet1")
que pour les premières références, c’est très risqué, car d’autres pourraient changer de contexte.Réponses:
Vous avez une erreur dans votre chaîne de conditions:
cond1 And cond2 Or cond3 Or cond4
évaluera toujoursTrue
si (ou les deux) decond3
oucond4
sontTrue
. C'est parce queAnd
sera évalué avantOr
. Voir la documentation pour plus d'informations.Vous pouvez utiliser des parenthèses pour ajuster l'ordre d'évaluation:
Cette expression n'évaluera
True
que sicond1
et quelscond2, cond3, cond4
sontTrue
.Dans votre cas, je recommanderais les améliorations suivantes à votre code:
For ... Next
etDo ... Loop
sont les deux types que vous devez savoir.Si nous examinons maintenant la
Workbook_BeforeSave
procédure, il n’est pas immédiatement évident de savoir ce qu’elle fait ici (c’est peut-être pour vous, car vous venez de mettre le code là-bas et vous en avez l’esprit en tête - mais revenons à cette feuille dans 3/6 / 12 mois et vous aurez d’abord besoin de comprendre ce qu’il fait). Remédions à cela:Désormais, tous ceux qui consultent le code peuvent savoir en un coup d’œil ce qui se passera lors de la sauvegarde du classeur.
Cette ligne
n'est pas très amical aux yeux. Verbatim dit-il
If FirstCellIsNotEmpty And AnyFollowingCellIsEmpty Then
. Codons cela de cette façon.Notez l'utilisation de
WorksheetFunction.CountBlank
pour éviter de devoir taper chaque cellule à vérifier.En fin de compte, je vais donner un exemple de ce à quoi votre
IsUserInputMissing
fonction pourrait ressembler. (Cependant, il reste encore beaucoup à faire.)Prenez votre temps et travaillez à travers. J'ai essayé de rendre les choses aussi claires que possible. Mais si quelque chose n'est pas clair. N'hésitez pas à demander. :)
la source