Formule passage à la ligne automatique
Bonjour à tous,
Je suis nouveau sur le forum et j’espère respecter l’ensemble des règles en postant mon problème ici.
Je me présente, je m’appelle Thibault et je suis en deuxième année de Master pour devenir Business Analyst. J’ai été formé tout au long de mon cursus sur de nombreux logiciels de traitement de données (Stata, Sas, R, Python,…) et très peu sur VBA, or j’ai commencé il y a quelque jour ma dernière année universitaire en alternance dans une entreprise qui utilise essentiellement VBA… Ce qui me pose problème étant donné qu’il y a très longtemps que je n’ai pas travaillé dessus…
Cela fait plusieurs jours que je me casse la tête sur une macro qui je pense est facile pour quelqu’un qui maîtrise… j’espère que vous pourrez m’aider.
Je possède une base de données similaire à celle-là (je suis désolé de ne pouvoir joindre la base réelle directement car je doute que l’entreprise soit d’accord) :
Code | Date | Lieu | Code Pro | Indice 1 | Heure1 | Indice 2 | Heure2 | Indice 3 | Heure3 | Indice 4 | Heure4 |
AAA | 12/08/2020 | PARIS | A20 | A | 18 :09 :36 | R | 18 :16 :25 | Y | 18 :22 :18 | T | 18 :24 :09 |
BBB | 12/08/2020 | MARSEILLE | Z12 | E | 14 :49 :34 | A | 14 :53 :23 | H | 14 :54 :18 | E | 14 :55 :42 |
CCC | 13/08/2020 | MARSEILLE | B67 | G | 12 :28 :12 | H | 12 :34 :23 | T | 12 :42 :18 | T | 12 :45 :26 |
DDD | 13/08/2020 | PARIS | Y28 | T | 20 :26 :32 | Y | 20 :32 :24 | E | A | ||
EEE | 14/08/2020 | PARIS | N65 | E | E | G | E | ||||
FFF | 14/08/2020 | PARIS | H08 | H | 20 :35 :16 | T | T | 20 :42 :17 | E | 20 :44 :36 | |
GGG | 14/08/2020 | PARIS | L27 | Y | 21 :26 :18 | A | 22 :16 :29 | E | 22 :18 :16 | U | 22 :36 :10 |
Ce qui m’intéresse, ce soit les lignes qui ont lieu à « Paris », et je cherche à créer une macro qui lorsqu’une ligne contient une cellule vide parmi les heures, la macro vient reporter le code, la date ainsi que le code pro de la ligne en question dans un tableau. J’ai donc commencé à écrire la macro suivante mais je me retrouve bloqué au moment de la boucle qui viendrait détecter les cellules vides d’une ligne. Je suis encore débutant, mon code n’est donc peut être pas très juste… J’ai utilisé une msgbox dans un premier temps afin de pouvoir vérifier ma macro mais je compte bien faire reporter les variables qui m’intéresse dans un tableau par la suite. J’ai représenté tous les cas de figure possible sur mon tableau ci-dessus : parfois j’ai aucune valeur sur toutes la ligne, des foi il en manque une ou deux ou des fois j’ai des valeurs mais qui s’arrête par la suite.
Voici ma macro, (j'ai mis en gras la partie qui me pose problème) :
Sub vba3()
Dim page1 As Worksheet
Dim derniere_ligne As Long
Dim ligne_en_cours As Long
Set page1 = Worksheets(1)
Dim cel_vide As Range
mot_clef = "paris"
derniere_ligne = page1.cells(Rows.Count, 1).End(xlUp).Row
For ligne_en_cours = derniere_ligne To 2 Step -1
If InStr(UCase(page1.cells(ligne_en_cours, 3)), UCase(mot_clef)) <> 1 Then
page1.cells(ligne_en_cours, 3).EntireRow.Delete
End If
Next
Dim numero_ligne As Integer
Dim numero_col As Integer
numero_ligne = 2
numero_col = 6
If Not IsEmpty(cells(numero_ligne, numero_col)) = True Then
numero_col = numero_col + 2
Else
numero_ligne = numero_ligne + 1
End If
MsgBox (cells(numero_ligne, 1))
End Sub
J’espère que vous pourrez m’aider, je vous remercie beaucoup par avance, n’hésitez pas si vous avez des questions…
Bonjour Thibault77 et bienvenue,
For lig = derniere_ligne To 2 Step -1
If UCase(page1.cells(lig, 3))= UCase(mot_clef)) Then
Blanc= len(Cells(lig,6)) * len(Cells(lig,8)) * len(Cells(lig,10)) * len(Cells(lig,12))
if Blanc = 0 then MsgBox("Sur cette ligne " & lig & " il manque 1 horaire au minimum")
End if
Par ce code ci-dessus si une cellule horaire de la ligne Paris est vide alors sa longueur sera de zéro. Et la variable Blanc donnera donc zéro.
Ensuite il est possible plutôt qu'un message de copier entièrement la ligne ou son rang dans le tableau sur un autre emplacement.
Bons tests, bonne continuation.
Bonjour le fil, bonjour le forum,
Une autre proposition avec ce code. Le tableau final est renvoyé dans l'onglet Feuil2 :
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim PL As Range 'déclare la variable PL (PLage)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Set O = Worksheets("Feuil1") 'définit l'onglet O
Set PL = O.Range("A1") 'initialise la plage PL (ça aurait pu être n'importe quelle cellule)
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
K = 1 'initialise la variable K
For I = 2 To UBound(TV) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
If UCase(TV(I, 3)) <> "PARIS" Then 'condition 1 : si la donnée ligne I colonne 3 de TV (convertie en Majuscules) n'est pas égale à "PARIS"
Set PL = IIf(PL.Cells.Count = 1, O.Rows(I), Application.Union(PL, O.Rows(I))) 'redéfinit la plage PL
Else 'sinon (condition 1)
If TV(I, 6) = "" Or TV(I, 8) = "" Or TV(I, 10) = "" Then 'condition 2 : si une des 3 colonnes d'heure est vide
ReDim Preserve TL(1 To 4, 1 To K) 'redimensionne le tableau des lignes TL (4 lignes K, colonnes)
For J = 1 To 4 'boucle 2 : sur 4 colonnes
TL(J, K) = TV(I, J) 'récupère dans la ligne J de TL la donnée en colonne I de TV (=> transposition)
Next J 'prochaine colonne de la boucle 2
K = K + 1 'incrémente K
End If 'fin de la condition 2
End If 'fin de la condition 1
Next I 'prochaine ligne de la boucle 1
PL.Delete 'efface la plage PL (est-ce vraiment nécessaire ?)
Worksheets("Feuil2").Range("A1").Resize(K - 1, 4).Value = Application.Transpose(TL) 'renvoie dans A1 de l'onglet "Feuil2" le tableau TL transposé
End Sub
Bonjour à tous,
Je viens d'adapter et d'essayer vos macros et ça marche nickel !!
Je vous remercie beaucoup pour votre aide et bonne journée