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

Rechercher des sujets similaires à "formule passage ligne automatique"