Construction d'une macro

Bonjour,

Me voilà arrivé sur cette section car je découvre les macros sur Excel. Jusqu'alors je n'avais pas eu besoin d'aller jusqu'ici mais maintenant c'est inévitable
Vous devinerez donc que je débute complètement.

Je souhaite traiter des données dans un fichier et supprimer ce qui ne m'intéresse pas, mais les lignes ne font pas toujours la même longueur. Plutôt que de déposer un fichier et vous laisser faire le boulot j'aimerai raisonner par étapes, vous montrer mon code, et que vous m'aidiez sur les commandes sur lesquelles je bute.

Voici la liste (non exhaustive) des étapes du traitement :

--Etape0 : faire une boucle à partir de la ligne 2 qui s'arrêtera lorsqu'il n'y aura plus de texte dans la colonne A

Sub boucle_while()

Dim numero As Integer
numero = 2

While Not IsEmpty(Worksheets("Routes_Optiques (2)").Range("A"))
Etapes suivantes à insérer
Wend

End Sub

--Etape1 : recherche du texte "STOCKEEPREAFFECTEE" puis écrire trois colonnes plus loin le texte "ATTENTE"

Cells.Find(What:="STOCKEEPREAFFECTEE", After:=ActiveCell, LookIn:= _
xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).Activate

Comment faire pour insérer du texte dans une cellule qui se trouve un peu plus loin que celle que j'ai trouvé ?

image

Je passerai à la suite une fois que j'aurai pu franchir cette étape.

Merci d'avance pour votre aide.

Bonjour

--Etape0 : faire une boucle à partir de la ligne 2 qui s'arrêtera lorsqu'il n'y aura plus de texte dans la colonne A

Ce que vous voulez faire c'est supprimer les lignes si la cellule en A ne contient pas d'information ? Donc ni chiffre, ni texte ni formule

Comment faire pour insérer du texte dans une cellule qui se trouve un peu plus loin que celle que j'ai trouvé ?

image

Je passerai à la suite une fois que j'aurai pu franchir cette étape.

Merci d'avance pour votre aide.

Bonjour, Bonjour Dan

Définis d'abord une cellule qui sera le résultat de ta recherche

Dim trouve as range
set trouve = cells.find("ce_que_je_cherche")

si ok, tu fais un offset

if not trouve is nothing then trouve.offset(x,y).value="blabla"

avec x décalage en ligne (donc 0 ici) et y décalage en colonnes (3 ici)

Bonjour le fil, bonjour le forum,

Pour le premier code une autre méthode :

Sub Macro1()
Dim O As Worksheets 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)

Set O = Worksheets("Routes_Optiques (2)") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet O
For I = 1 To DL 'boucle de 1 a DL
    'ton code
Next I 'prochaine ligne de la boucle
End Sub

Et si tu dois supprimer des lignes il faut que la boucle soit inversée :

Sub Macro2()
Dim O As Worksheets 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)

Set O = Worksheets("Routes_Optiques (2)") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet O
For I = DL To 1 Step -1 'boucle inversée de DL à 1
    'ton code
    'O.Rows(I).Delete'supprime la ligne I
Next I 'prochaine ligne de la boucle en remontant
End Sub

Bonjour à tous.

Je pense qu'il serait plus judicieux d'expliquer l'intégralité de votre problème plutôt que de faire des demandes partielles auquelles nous allons répondre mais

pas forcément avec la meilleur méthode si en finalité votre projet est différent.

Sub Macro1()

Dim derligne As Long  ' Variable dernière ligne utilisée colonne A
derligne = Worksheets("Routes_Optiques (2)").Range("A65536").End(xlUp).Row

For i = 1 To derligne
If Worksheets("Routes_Optiques (2)").Cells(i, 1).Value = "STOCKEEPREAFFECTEE" Then
Worksheets("Routes_Optiques (2)").Cells(i, 4).Value = "ATTENTE"
End If
Next i

End Sub

Merci à tous pour ces réponses si rapides !

Je ne souhaite pas supprimer des lignes, mais retirer des données intermédiaires dans les lignes trop longues. Ce sera l'objet des étapes suivantes mais je dois d'abord faire du traitement et ajouter du texte manquant. Je vais tester tout de suite ce que vous m'avez donné.

Pour répondre à Xmenpl, j'aimerai tout d'abord arriver à comprendre ce que je fais, pour le moment ce n'est pas gagné...

J'ai testé les méthodes décrites, tenté de mélanger, sans succès. Voici les erreurs que je rencontre :

Méthode1 : erreur d'exécution sur While Not IsEmpty

Sub boucle_while()

Dim numero As Integer
numero = 2
Dim trouve As Range
Set trouve = Cells.Find("STOCKEEPREAFFECTEE")

While Not IsEmpty(Worksheets("Routes_Optiques (2)").Range("A"))
If Not trouve Is Nothing Then trouve.Offset(0, 3).Value = "ATTENTE"
Wend

End Sub

Méthode2 : erreur d’exécution sur Set O = Worksheets

Sub Macro1()
Dim O As Worksheets 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)

Set O = Worksheets("Routes_Optiques (2)") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet O
For i = 1 To DL 'boucle de 1 a DL
If Worksheets("Routes_Optiques (2)").Cells(i, 1).Value = "STOCKEEPREAFFECTEE" Then
Worksheets("Routes_Optiques (2)").Cells(i, 4).Value = "ATTENTE"
End If
Next i
End Sub

Méthode3 : il ne se passe rien

Sub Macro1()

Dim derligne As Long  ' Variable dernière ligne utilisée colonne A
derligne = Worksheets("Routes_Optiques (2)").Range("A65536").End(xlUp).Row

For i = 2 To derligne
If Worksheets("Routes_Optiques (2)").Cells(i, 1).Value = "STOCKEEPREAFFECTEE" Then
Worksheets("Routes_Optiques (2)").Cells(i, 4).Value = "ATTENTE"
End If
Next i

End Sub

Pourquoi mets-tu la recherche en dehors de la boucle; ceci suffit, sauf que ce n'est que pour la première, il faut donc boucler jusqu'à ne plus en trouver

Sub boucle_while()

Dim trouve As Range
Set trouve = Cells.Find("STOCKEEPREAFFECTEE")
If Not trouve Is Nothing Then trouve.Offset(0, 3).Value = "ATTENTE"

End Sub

Comme tu débutes pour apprendre, je te laisse découvrir et comprendre cette macro

With Worksheets(1).Range("a:a")
    Set c = .Find("ce_que_je_cherche", lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            'code xxxx
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With

Re : Vous n'avez pas souhaitez joindre un fichier Excel représentatif de vos données; juste une image.

On ignore donc le contenu exacte de la colonne A ? des espaces en trop des caractères spéciaux ?

Dans l'exemple ci-après la macro fonctionne correctement ... encore faut-il que le contenu de la colonne A soit bien = à "STOCKEEPREAFFECTEE" ?

1classeur-test.xlsm (16.86 Ko)

Vous n'aurez que des approches de la solution si vous ne joignez pas de fichier avec un exemple concret de vos données ( données confidentielles non incluses biensur.)

Bonjour le fil, bonjour le forum,

Bon courage, moi je passe la main... je le garde pour mon canon, il est bien rond et bien lisse...

Re

Lol ! Thauthème

@Apetit, ce qu'il faudrait comprendre c'est si l'étape 0 et 1 sont deux choses recherchées séparément ou si vous cherchez le texte STOCKEEPREAFFECTEE dans la colonne A ou dans une autre colonne

Sinon en fonction de l'étape 0 que vous décrivez, voilà le code

Sub boucle()
Dim cel As Range

For Each cel In Range("A:A")
    If cel = "" Then cel.Select: Exit Sub 'ou ceci --> If IsEmpty(cel) Then cel.Select: Exit Sub
Next cel

End Sub

La boucle s'arrêtera lorsque la cellule sera vide

Désolé, je me perds dans les lignes car je ne connais pas le langage et il m'est difficile de me concentrer sur sa lecture.

Steelson, ton exemple fonctionne effectivement sur la première ligne, je vais voir pour faire une boucle. Pour la macro exemple, je ne comprends que les trois premières lignes. Les termes de type"If Not c Is Nothing Then" ou "Loop While Not c Is Nothing" me troublent complètement.

Je vais tout de même préparer un fichier exemple car il y a encore d'autres choses à faire dessus avec cette macro.

Merci pour votre patience

Et pour répondre à Xmenpl, l'exemple est parfait, mais je n'arrive pas à la faire fonctionner dans mon fichier.

Changement de stratégie, voici un fichier exemple nettoyé. J'ai laissé volontairement une grosse quantité de données pour voir rapidement le résultat.

- L'objectif est de retirer les données intermédiaires pour ne conserver que les colonnes dont les titres sont surlignés en jaune (exemple avec la première ligne). Cela parait simple sur le papier mais si vous dé-zommez au maximum vous verrez que les lignes ne font pas toutes la même longueur. Mes techniciens font actuellement le ménage à la main et cela prend un temps considérable... Dans l'onglet résultat vous pouvez voir le début du travail de nettoyage pour avoir une idée de ce à quoi cela doit ressembler.

Si je reprends ce que je souhaite automatiser :

- Etape1 : compléter la dernière colonne titrée CABLE.

image

Devient :

image

- Etape2 : ligne par ligne, effacer les 5 cellules qui précèdent la cellule ABONNE ou ATTENTE, et décaler les données sur la gauche

image

- Etape3 : toujours ligne par ligne, conserver les cellules titrées F T CABLE et effacer toute les cellules qui précèdent sauf les 6 du début de la ligne, et décaler les données sur la gauche.

J'espère être assez clair dans mes explications, ce n'est pas simple à décrire.

2classeurtest.zip (284.52 Ko)

Pour la macro exemple, je ne comprends que les trois premières lignes. Les termes de type"If Not c Is Nothing Then" ou "Loop While Not c Is Nothing" me troublent complètement.

je poursuis sous l'angle didactique ...

  • quand on recherche par find, la macro s'arrête à la première occurrence trouvée
  • on utilise alors findnext pour la suivante ... mais findnext reviendra sur la première et poursuivra sa course infinie, il faut l'arrêter quand on revient sur le premier trouvé que j'ai nommé ici firstAddress

la macro dit ceci ligne à lifne

  1. dans la feuille 1 colonne A
  2. je cherche la cellule c dans laquelle je vais trouver ce_que_je_cherche
  3. si c n'est pas rien, c'est qu'il a trouvé c
  4. alors je sauvegarde cette première adresse
  5. et je fais
  6. mon code
  7. puis je lance findnext
  8. jusqu'à ce que c soit égal à firstaddress
With Worksheets(1).Range("a:a")
    Set c = .Find("ce_que_je_cherche", lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            'code xxxx
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With

maintenant on put faire plus simple en balayant juste tes lignes une par une

--Etape0 : faire une boucle à partir de la ligne 2 qui s'arrêtera lorsqu'il n'y aura plus de texte dans la colonne A

--Etape1 : recherche du texte "STOCKEEPREAFFECTEE" puis écrire trois colonnes plus loin le texte "ATTENTE"

Un conseil @ APetit : tu as 2 sujets en un, à éviter.

J'ai tendance à répondre au sujet Etape1, alors que d'autres sont sur le sujet Etape0, on ne s'y retrouve plus ! et j'ai l'impression que ton fichier est encore autre chose.

Fais en sorte d'avoir un seul sujet par fil de discussion

Il s'agit bien d'un même sujet. Seulement je voulais l'aborder par étapes. Mais c'est vrai que les étapes 0 et 1 sont regroupées, car je veux écrire mon texte en passant par une boucle qui va traiter les lignes une par une.

Je me penche ce soir à tête reposée sur ton autre réponse.

Le problème est que la valeur cherchée se trouve dans plusieurs colonne N et S donc déjà pas en A comme dans la première demande.

Quand au résultat voulu en colonne Cable .... : il y a je ne sais combien de colonne avec le même intitulé cable.

Pas étonnant que ma macro ne fonctionne pas dans ton exemple. je ne sais même pas ce qu'il faut faire avec ton exemple de données

Bonjour à tous. Oui cette arborescence variable est la difficulté principale à contourner. Je n'ai pas indiqué que la valeur cherchée était en colonne A mais c'est vrai que cela portait à confusion. Avec le fichier c'est plus clair pour illustrer le besoin.

Steelson, j'ai parfaitement compris le code exemple que tu avais donné avec tes explications, merci beaucoup. Est-ce que c.Address correspond bien à la position de la cellule ?

La solution pour le traitement semble effectivement de traiter ligne par ligne en recherchant le terme, je suis en train de faire des tests.

Rechercher des sujets similaires à "construction macro"