Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Je teste en F sur certaines lignes si il y a un "X". Si il y a un "X", je contrôle le remplissage de la ligne.
Si la ligne n'est pas correctement remplie, je renvoie une erreur Msgbox.
Si la ligne n'est pas correctement remplie, on ne copie aucunes données.
Voilà le soucis:
Si il y a plusieurs erreurs de remplissage je me retrouve avec beaucoup de Msgbox. Comment mettre toutes les erreurs dans un seul Msgbox séparées par sauts de lignes?
Si il y a des erreurs, mes lignes sont quand même copiées, je ne trouve pas le soucis ??
Re : Boucle conditions qui déconne + problème Msgbox
Salut Arnaudbu
A Tester
VB:
Sub archivage()
Dim FlgErr As Boolean
TabLignes = Array(4, 5)
TabNC = Array("G", "H", "I", "J", "K", "L", "M", "N")
FlgErr = False
With Sheets("feuil1")
For i = LBound(TabLignes) To UBound(TabLignes)
Set rd = Sheets("feuil2").Range("A65536").End(xlUp).Offset(1, 0)
Set rs = .Range("I" & TabLignes(i)).Resize(1, 7)
If .Range("F" & TabLignes(i)).Value = "X" Then
For j = LBound(TabNC) To UBound(TabNC)
If .Range(TabNC(j) & TabLignes(i)).Value = "" Then
MSG = MSG & "Critères: " & .Range("B" & TabLignes(i)).Value & _
" Manque: " & .Range(TabNC(j) & "2").Value & vbCrLf
fglerr = True ' Mettre le flag erreur
End If
Next j
If FlgErr = False Then
rs.Copy
rd.PasteSpecial xlValues
rd.PasteSpecial xlFormats
Else
FlgErr = False ' Réinitialiser le flag
End If
End If
Next i
MsgBox MSG, vbOKOnly, "Information"
End With
MSG = MsgBox("sauvegardées", vbOKOnly, "Information")
End Sub
Re : Boucle conditions qui déconne + problème Msgbox
Bonsoir,
Apparemment tu ne testes le "X" uniquement dans la colonne F !?
Code:
Sub archivage()
Dim b As Boolean, i%, j%, Texte$, tablo, dl%
b = False
With Sheets("feuil1")
For i = 4 To .Range("B65000").End(xlUp).Row
If UCase(.Cells(i, 6)) = "X" Then
For j = 7 To 14
If .Cells(i, j) = "" Then
b = True
Texte = Texte & Chr(64 + j) & ","
End If
Next j
If b Then
MsgBox "Critères: " & .Cells(i, 2) & " Manque: " & Texte
Else
tablo = .Range("I" & i & ":N" & i).Value
With Sheets("Feuil2")
dl = .Range("A65000").End(xlUp).Row + 1
.Range("A" & dl).Resize(1, UBound(tablo, 2)) = tablo
End With
End If
End If
Next
End With
MsgBox "termined"
End Sub
Re : Boucle conditions qui déconne + problème Msgbox
Salut arnaudbu et le forum
Comme BrunoM45 a répondu, je vais juste critiquer ta macro, yerk, yerk
Déclarer ses variables en début de module général les rend globales : plus courte est la durée de vie d'une variable, moins tu maîtrises son contenu. Ne déclarer en variables globales que celles qui doivent réellement l'être est préférable.
Tu déclares des variables servant aux lignes en type Integer. Par expérience, maintenant, je déclares systématiquement mes variables avec le type qui leur permettra d'avoir leur valeur maximale, sans déclencher d'erreur. Un espace intempestif en fin de colonne (ligne 65536) m'a coûté des heures de recherche, n'ayant que moins de 1000 lignes de remplies.
Mais les déclarer c'est bien.
Je sais que ça semble fastidieux et inutile, mais l'indentation n'est pas là pour faire beau : même si tu as des dizaines de boucles, tests, with, avec une bonne indentation, tu sais toujours à quel niveau tu es, même si le début est 5 pages plus haut.
For j = LBound(TabNC) To UBound(TabNC)
If .Range(TabNC(j) & TabLignes(i)).Value = "" Then
MSG = MsgBox("Critères: " & .Range("B" & TabLignes(i)).Value & _
" Manque: " & .Range(TabNC(j) & "2").Value, vbOKOnly, "Information")
End If
Next j
rs.Copy
rd.PasteSpecial xlValues
rd.PasteSpecial xlFormats
Juste pour que tu comprennes ton erreur :
- tu changes de J => tu passes à l'instruction suivante
- tu testes : détection d'une erreur => message
- tu copies tes données : le test ne fait pas sauter la copie des données, que ton test soit positif (tu mets le message) ou négatif (tu ne mets pas le message), tu copies dans les deux cas.
Il faudrait faire un algorithme (ça fait mousser de mettre des termes pédants ) qui tienne compte du message. Un truc du genre
Flg=true (variable booléenne
Boucle sur J
si la condition de J fausse, alors
- on met Flg=faux
- on sort de la boucle J
fin de test de J
fin de boucle J
Si Flg alors (Flg =True => si Flg est vrai, on a (True = True) => c'est forcément True. Si Flg est faux, on a (False = True) c'est forcément False => pas la peine de mettre un test d'une égalité en plus)
- (on n'a donc pas d'erreur) => on copie
Else sinon, on a une erreur
- on averti
fin test Flg
Quand on fait des boucles, avec un test à l'intérieur qui conditionne l'action de la boucle : le plus simple et plus rapide, c'est de sortir de la boucle dès que le test n'est pas bon, et de traiter à l'extérieur de la boucle l'avertissement
A+
Salut arnaudbu et le forum
Comme BrunoM45 a répondu, je vais juste critiquer ta macro, yerk, yerk
Déclarer ses variables en début de module général les rend globales : plus courte est la durée de vie d'une variable, moins tu maîtrises son contenu. Ne déclarer en variables globales que celles qui doivent réellement l'être est préférable.
Tu déclares des variables servant aux lignes en type Integer. Par expérience, maintenant, je déclares systématiquement mes variables avec le type qui leur permettra d'avoir leur valeur maximale, sans déclencher d'erreur. Un espace intempestif en fin de colonne (ligne 65536) m'a coûté des heures de recherche, n'ayant que moins de 1000 lignes de remplies.
Mais les déclarer c'est bien.
Je sais que ça semble fastidieux et inutile, mais l'indentation n'est pas là pour faire beau : même si tu as des dizaines de boucles, tests, with, avec une bonne indentation, tu sais toujours à quel niveau tu es, même si le début est 5 pages plus haut.
For j = LBound(TabNC) To UBound(TabNC)
If .Range(TabNC(j) & TabLignes(i)).Value = "" Then
MSG = MsgBox("Critères: " & .Range("B" & TabLignes(i)).Value & _
" Manque: " & .Range(TabNC(j) & "2").Value, vbOKOnly, "Information")
End If
Next j
rs.Copy
rd.PasteSpecial xlValues
rd.PasteSpecial xlFormats
Juste pour que tu comprennes ton erreur :
- tu changes de J => tu passes à l'instruction suivante
- tu testes : détection d'une erreur => message
- tu copies tes données : le test ne fait pas sauter la copie des données, que ton test soit positif (tu mets le message) ou négatif (tu ne mets pas le message), tu copies dans les deux cas.
Il faudrait faire un algorithme (ça fait mousser de mettre des termes pédants ) qui tienne compte du message. Un truc du genre
Flg=true (variable booléenne
Boucle sur J
si la condition de J fausse, alors
- on met Flg=faux
- on sort de la boucle J
fin de test de J
fin de boucle J
Si Flg alors (Flg =True => si Flg est vrai, on a (True = True) => c'est forcément True. Si Flg est faux, on a (False = True) c'est forcément False => pas la peine de mettre un test d'une égalité en plus)
- (on n'a donc pas d'erreur) => on copie
Else sinon, on a une erreur
- on averti
fin test Flg
Quand on fait des boucles, avec un test à l'intérieur qui conditionne l'action de la boucle : le plus simple et plus rapide, c'est de sortir de la boucle dès que le test n'est pas bon, et de traiter à l'extérieur de la boucle l'avertissement
A+
Mouais
Même si une solution proposée ne convient pas, la moindre des corrections est de le faire savoir...
Je ne vois pas où est la difficulté...donc toujours avec le même code
Code:
Sub archivage2()
Dim b As Boolean, ArrL, ArrC, i%, j%, Texte$, tablo, dl%
b = False
ArrL = Array(4, 5)
ArrC = Array(7, 8, 9, 10, 11, 12, 13, 14)
With Sheets("feuil1")
For i = 0 To UBound(ArrL)
If UCase(.Cells(ArrL(i), 6)) = "X" Then
For j = 0 To UBound(ArrC)
If .Cells(ArrL(i), ArrC(j)) = "" Then
b = True
Texte = Texte & Chr(64 + ArrC(j)) & ","
End If
Next j
If b Then
Texte = Left(Texte, Len(Texte) - 1)
MsgBox "Critères: " & .Cells(ArrL(i), 2) & " Manque: " & Texte
Else
tablo = .Range("I" & i & ":N" & i).Value
With Sheets("Feuil2")
dl = .Range("A65000").End(xlUp).Row + 1
.Range("A" & dl).Resize(1, UBound(tablo, 2)) = tablo
End With
End If
End If
Next
End With
MsgBox "termined"
End Sub
Re : Boucle conditions qui déconne + problème Msgbox
Ok merci.
Pour quoi c'est écrit comme ça: i%, j%, Texte$, tablo, dl% au lieu des integer, variant etc...
J'essaye de remettre le code, mais il ne met pas toutes les erreurs dans un seul MSGbox, puis erreur sur: Texte = Left(Texte, Len(Texte) - 1) = incompatibilité de type + message d'erreur Mshbox sur toutes les bonnes lignes.
Re : Boucle conditions qui déconne + problème Msgbox
Salut
les Array sont-ils vraiment nécessaires ?
Code:
Sub Archive()
Dim n As Long, L As Long, C As Range, Mes As String, Suite As String
Feuil2.Cells.Clear
For n = 4 To 9 [B][COLOR="Green"]'choix des lignes[/COLOR][/B]
If Cells(n, "F") <> "" Then
For Each C In Range("G" & n, "H" & n) [B][COLOR="green"]'choix des colonnes[/COLOR][/B]
If C = "" Then Mes = Mes & C.Address & " est vide" & Chr(10)
Next
If Mes = "" Then
L = L + 1
Feuil2.Range("A1:F1").Offset(L, 0).Value = Range("I" & n & ":N" & n).Value
Mes = ""
End If
End If
Next
If Mes <> "" Then Suite = Chr(10) & "mais, attention, " & Chr(10) & Mes
MsgBox "lignes complètes copiées " & Suite, vbOKOnly, "Pour information"
End Sub
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.