Vérification cellules pleines sur plage de données
Bonjour à tous,
Excusez le titre, mais difficle de faire plus court.
La question centrale de mon topic est celle ci : existe-t-il un moyen de scanner une plage de données complètes d'une seule traite et ne pas vérifier chaque cellule avec un For Each ? Pour mieux comprendre je vous invite bien sûr à lire la suite. =)
La verson longue de l'explication :
Petit topo sur mon code avant d'expliciter mon besoin.
Celui ci réalise un traitement (copier-coller) depuis 2 fichiers sources vers un fichier synthèse dans certaines conditions.
- La première condition est d'avoir un numéro affecté sur une case B5 (puis B19, B33 et ainsi de suite - step 14).
- 2ème condition il regarde chaque cellule d'une plage de données (elle aussi raccordée à une boucle en step 14). Si une cellule de cette plage est vide il réalise le traitement du fichier source n°1 (à savoir fichier BE) puis réalise le traitement du 2ème fichier source (à savoir fichier qualité).
Tout ceci fonctionne à merveille sauf qu'il me manque une dernière chose. Je voudrais que le fichier réalise le traitement du 2ème fichier source (toujours le fichier qualité) si celui ci comporte une case vide dans sa propre plage de données mais que le fichier source n°1 ne comporte que des cases pleines dans sa plage. J'ai tenté quelque chose avec une nouvelle boucle :
For Each Cell in Range blabla
If Cell <> "" Then... Mon traitement du fichier qualité
Voici le code en question : pour moi tout doit se jouer dans le
If o = "". Du moins il manque un Else à ce niveau pour envoyer mon scan complet de la plage de donnée du fichier qualité.
Sub Bouton345_Cliquer()
'cacher les bascules pendant le traitement
Application.ScreenUpdating = False
'déclarer les variables
Dim iRC%, iRS% '(iRS = RowSource,iRC = RowCible)
Dim WsS As Worksheet, WsC As Worksheet, WsQ As Worksheet
Dim o As Range, oo As Range, CellCount As Range
Dim flag As Boolean
Dim compteur As Integer
'Ouvrir les fichiers excel
Workbooks.Open ("C:\Users\st_chal\Desktop\Suivi modules G\Suivi_Modules_G_BE.xlsm")
Workbooks.Open ("C:\Users\st_chal\Desktop\Suivi modules G\Suivi_Modules_G_Qualite.xlsm")
Set WsS = Workbooks("Suivi_Modules_G_BE.xlsm").Worksheets("Suivi_BE")
Set WsC = Workbooks("Suivi_Modules_G_Synthese_essai.xlsm").Worksheets("Suivi_Modules")
Set WsQ = Workbooks("Suivi_Modules_G_Qualite.xlsm").Worksheets("Suivi_Qualite")
'Initialisation de la cible
iRC = 4
With WsS
'pour i allant de 5 à 200 avec un pas de 14 sur fichier BE
For iRS = 5 To 1000 Step 14
If .Cells(iRS, 2).Value <> "" Then
'super condition pour BE : scanner plage de données = si 1 vide entrer dans le traitement
For Each o In .Range(.Cells(iRS + 7, 2), .Cells(iRS + 11, 6))
'si case vide pendant le scan de la plage B12 : F16
If o = "" Then 'On copie toute la plage de données (avec les dates)
flag = True
.Cells(iRS, 2).Copy
WsC.Cells(iRC, 2).PasteSpecial xlPasteAll
.Range(.Cells(iRS + 7, 2), .Cells(iRS + 11, 6)).Copy
WsC.Range(WsC.Cells(iRC + 8, 3), WsC.Cells(iRC + 12, 7)).PasteSpecial xlPasteAll
'copie les dates de prélèvement sur fichier BE
.Cells(iRS + 1, 2).Copy
WsC.Cells(iRC + 1, 2).PasteSpecial xlPasteAll
.Cells(iRS + 2, 2).Copy
WsC.Cells(iRC + 2, 2).PasteSpecial xlPasteAll
'--------------------------------------------------
'Lancer le traitement du fichier qualité
'--------------------------------------------------
'trouver le n° d'OF côté qualité
For iQ = 5 To 1000 Step 14
'si n° d'OF trouvé
If .Cells(iRS, 2).Value = WsQ.Cells(iQ, 2) Then
'Copie les dates de convocation aux APAVE sur fichier QU
WsQ.Cells(iQ + 1, 2).Copy
WsC.Cells(iRC + 3, 2).PasteSpecial xlPasteAll
WsQ.Cells(iQ + 2, 2).Copy
WsC.Cells(iRC + 4, 2).PasteSpecial xlPasteAll
'Copier la plage de données QU sur synthèse (hors dossier final et cahier de soudage)
WsQ.Range(WsQ.Cells(iQ + 7, 3), WsQ.Cells(iQ + 12, 6)).Copy
WsC.Range(WsC.Cells(iRC + 8, 8), WsC.Cells(iRC + 12, 11)).PasteSpecial xlPasteAll
'copier plage cahier de soudage
WsQ.Range(WsQ.Cells(iQ + 7, 2), WsQ.Cells(iQ + 12, 2)).Copy
WsC.Range(WsC.Cells(iRC + 8, 2), WsC.Cells(iRC + 12, 2)).PasteSpecial xlPasteAll
'Colonne dossier final - Ligne 1 date réal'
If IsEmpty(WsQ.Cells(iQ + 7, 7)) Or IsEmpty(WsQ.Cells(iQ + 7, 8)) Or IsEmpty(WsQ.Cells(iQ + 7, 9)) Then
WsC.Cells(iRC + 8, 12) = ""
Else
WsQ.Cells(iQ + 7, 8).Copy
WsC.Cells(iRC + 8, 12).PasteSpecial xlPasteAll
End If
'Colonne dossier final - Ligne 2 date envoi APAVE n°1
If IsEmpty(WsQ.Cells(iQ + 8, 7)) Or IsEmpty(WsQ.Cells(iQ + 8, 8)) Or IsEmpty(WsQ.Cells(iQ + 8, 9)) Then
WsC.Cells(iRC + 9, 12) = ""
Else
WsQ.Cells(iQ + 8, 8).Copy
WsC.Cells(iRC + 9, 12).PasteSpecial xlPasteAll
End If
'Colonne dossier final - Ligne 3 date retour APAVE
If IsEmpty(WsQ.Cells(iQ + 9, 7)) Or IsEmpty(WsQ.Cells(iQ + 9, 8)) Or IsEmpty(WsQ.Cells(iQ + 9, 9)) Then
WsC.Cells(iRC + 10, 12) = ""
Else
WsQ.Cells(iQ + 9, 8).Copy
WsC.Cells(iRC + 10, 12).PasteSpecial xlPasteAll
End If
'Colonne dossier final - Ligne 4 date envoi APAVE n°2
If IsEmpty(WsQ.Cells(iQ + 10, 7)) Or IsEmpty(WsQ.Cells(iQ + 10, 8)) Or IsEmpty(WsQ.Cells(iQ + 10, 9)) Then
WsC.Cells(iRC + 11, 12) = ""
Else
WsQ.Cells(iQ + 10, 8).Copy
WsC.Cells(iRC + 11, 12).PasteSpecial xlPasteAll
End If
'Colonne dossier final - Ligne 5 date soldée
If IsEmpty(WsQ.Cells(iQ + 11, 7)) Or IsEmpty(WsQ.Cells(iQ + 11, 8)) Or IsEmpty(WsQ.Cells(iQ + 11, 9)) Then
WsC.Cells(iRC + 12, 12) = ""
Else
WsQ.Cells(iQ + 11, 8).Copy
WsC.Cells(iRC + 12, 12).PasteSpecial xlPasteAll
End If
End If
Next iQ
'--------------------------------------------------
'Fin de traitement du fichier qualité
'--------------------------------------------------
For Each oo In WsC.Range(WsC.Cells(iRC + 8, 2), WsC.Cells(iRC + 12, 12))
'on remplace les vides par NON
If oo = "" Then
oo = "NON"
End If
Next oo
Exit For
End If
Next o
'on incrémente la ligne cible sur fichier synthèse
If flag Then iRC = iRC + 14
flag = False
End If
Next iRS
End With
With WsC
compteur = 0
For iCount = 4 To 1000 Step 14
For Each CellCount In .Range("B" & iCount)
If CellCount <> "" Then
compteur = compteur + 1
End If
Next CellCount
Next iCount
'afficher le nombre d'affaires non soldées trouvées
MsgBox "Nombre d'affaires non soldée trouvée : " & compteur
End With
Workbooks("Suivi_Modules_G_BE.xlsm").Close
Workbooks("Suivi_Modules_G_Qualite.xlsm").Close
Application.CutCopyMode = False
End SubAu plaisir de lire vos aides et propositions de solutions qui je l'espère seront aussi efficace que possible.
Merci par avance,
H.
bonjour
j'ai pas regarder dans le détail ton code mais je pense a un truc je ne sais pas si cela est possible dans ton cas mais.... des fois des idées simple ne me viennent pas tout de suite personnellement .....
il existe sous excel la fonction
nb.vide(plage)ne pourrais pas tu utiliser une instruction du genre
resultat = Application.WorksheetFunction.CountBlank(plage)fred
Bonjour fred,
Merci pour ta très bonne idée ! Ca a l'air de pouvoir fonctionner avec cette fonction, il va simplement me falloir un peu de temps et beaucoup d'essais pour l'adapter.
Merci encore,
Cordialement,
H.