Besoin d'une macro loop
Résolu/Fermé
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
-
29 nov. 2017 à 17:06
salsero75014 Messages postés 32 Date d'inscription mercredi 29 novembre 2017 Statut Membre Dernière intervention 11 mai 2018 - 1 déc. 2017 à 17:48
salsero75014 Messages postés 32 Date d'inscription mercredi 29 novembre 2017 Statut Membre Dernière intervention 11 mai 2018 - 1 déc. 2017 à 17:48
A voir également:
- Besoin d'une macro loop
- Macro logiciel - Télécharger - Organisation
- Macro recorder - Télécharger - Confidentialité
- Macro Recorder - Télécharger - Divers Utilitaires
- Lancer une macro dans une macro - Astuces et Solutions
- Macro word - Guide
20 réponses
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
29 nov. 2017 à 18:36
29 nov. 2017 à 18:36
Bonjour,
Voir ceci:
https://forums.commentcamarche.net/forum/affich-37621992-methode-find-dans-vba-recherche-de-donnees-sous-excel
Ce qui donne pour la Feuille1 et la colonne A, a adapter:
Voir ceci:
https://forums.commentcamarche.net/forum/affich-37621992-methode-find-dans-vba-recherche-de-donnees-sous-excel
Ce qui donne pour la Feuille1 et la colonne A, a adapter:
Sub Principale()
Dim Plage As Range
Dim Lignes(), i As Long
Dim Texte As String
Dim Flag As Boolean
Dim maligne As Integer
Set Plage = Sheets("Feuil1").Columns(1) 'plage de recherche colonne A
Texte = "S/Total R2017" 'expression cherchée
Flag = Find_Next(Plage, Texte, Lignes()) 'appel de la fonction
If Flag Then 'si fonction retourne Vrai = expression trouvée dans la plage
For i = LBound(Lignes) To UBound(Lignes) 'restitution des lignes correspondantes
maligne = Lignes(i)
Range("A" & maligne - 3).Copy ActiveSheet.Range("A" & maligne) 'copier coller
Application.CutCopyMode = False
Next i
Else
MsgBox "L'expression : " & Texte & " n'a pas été trouvée dans la plage : " & Plage.Address
End If
End Sub
'Sources : Michel_m
'http://www.commentcamarche.net/forum/affich-31432413-importation-de-donnees-sans-doublons#9
Function Find_Next(Rng As Range, Texte As String, Tbl()) As Boolean
Dim Nbre As Integer, Lig As Long, Cptr As Long
Nbre = Application.CountIf(Rng, Texte)
If Nbre > 0 Then
ReDim Tbl(Nbre - 1)
Lig = 1
For Cptr = 0 To Nbre - 1
Lig = Rng.Find(Texte, Cells(Lig, Rng.Column), xlValues).Row
Tbl(Cptr) = Lig
Next
Else
GoTo Absent
End If
Find_Next = True
Exit Function
Absent:
Find_Next = False
End Function
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
1
30 nov. 2017 à 10:09
30 nov. 2017 à 10:09
Bonjour merci beaucoup,
Je n'aurais surment pas été capable de refaire la meme chose
Je n'aurais surment pas été capable de refaire la meme chose
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
1
30 nov. 2017 à 10:23
30 nov. 2017 à 10:23
C'est dommage car ca ne march pas? la fonction me dit ne pas trouver la chaine de caractères "S/Total R2017" dans $B :$B
alors qu'elle s y trouve bien
alors qu'elle s y trouve bien
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
Modifié le 30 nov. 2017 à 11:02
Modifié le 30 nov. 2017 à 11:02
sur l'image je vois:
S/Total R2017/00027
ce n'est pas la même chose!
Il va falloir que tu enlèves d"abord les caractères après / avant de faire ta boucle!
pour cela voir ici:
https://silkyroad.developpez.com/VBA/ManipulerChainesCaracteres/#LI-I
@+ Le Pivert
S/Total R2017/00027
ce n'est pas la même chose!
Il va falloir que tu enlèves d"abord les caractères après / avant de faire ta boucle!
pour cela voir ici:
https://silkyroad.developpez.com/VBA/ManipulerChainesCaracteres/#LI-I
@+ Le Pivert
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
30 nov. 2017 à 12:01
30 nov. 2017 à 12:01
Voilà un exemple dans le Feuille 1 colonne B a adapter:
Option Explicit
Private Sub CommandButton1_Click()
Dim Tableau() As String
Dim nom As String
Dim FL1 As Worksheet, NoCol, i As Integer
Dim NoLig As Long, Var As Variant
Set FL1 = Worksheets("Feuil1")
NoCol = 2 'lecture de la colonne B
For NoLig = 1 To Split(FL1.UsedRange.Address, "$")(4)
Var = FL1.Cells(NoLig, NoCol)
'découpe la chaine en fonction des espaces " "
'le résultat de la fonction Split est stocké dans un tableau
Tableau = Split(Var, " ")
For i = 0 To UBound(Tableau)
' Debug.Print Tableau(i)
Next i
nom = Tableau(0) '1èrechaine = S/Total
If nom = "S/Total" Then
Range("B" & NoLig - 3).Copy ActiveSheet.Range("B" & NoLig) 'copier coller
Application.CutCopyMode = False
End If
Next
Set FL1 = Nothing
End Sub
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
1
30 nov. 2017 à 14:01
30 nov. 2017 à 14:01
J'avais déja fait pour essayer d'enlever, mais merci beaucoup je vais essayer de me débrouiller avec votre deuxième macro. J'etais loin de pouvoir faire une macro comme ça en fait lol
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
1
30 nov. 2017 à 14:26
30 nov. 2017 à 14:26
Dernière chose, l'occurence (nom = Tableau(0)) dans ta macro elle signifie quoi?
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
Modifié le 30 nov. 2017 à 15:06
Modifié le 30 nov. 2017 à 15:06
C'est indiqué dans la macro:
la séparation se fait à chaque espace:
le tableau commence à 0
Si tu enleves l'apostrophe à cette ligne tu verras le résultat en bas
' Debug.Print Tableau(i)
Tout est expliqué dans le site que j'ai mentionné
'Le résultat s'affiche dans la fenêtre d'execution de l'éditeur de macros
Debug.Print Tableau(i)
@+ Le Pivert
nom = Tableau(0) '1èrechaine = S/Total
la séparation se fait à chaque espace:
nom = Tableau(1) '2ème chaine = R2017/00027
le tableau commence à 0
Si tu enleves l'apostrophe à cette ligne tu verras le résultat en bas
' Debug.Print Tableau(i)
Tout est expliqué dans le site que j'ai mentionné
'Le résultat s'affiche dans la fenêtre d'execution de l'éditeur de macros
Debug.Print Tableau(i)
@+ Le Pivert
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
1
30 nov. 2017 à 18:09
30 nov. 2017 à 18:09
Je comprend mais ca me bogue "indice n'appartient pas à la selection)
en plus j'ai pas vu le (2)
en plus j'ai pas vu le (2)
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
Modifié le 30 nov. 2017 à 18:26
Modifié le 30 nov. 2017 à 18:26
C'est normal que cela bug, si dans ta colonne il y a des chaines de caractères sans espace!
Que cherches-tu à faire?
Regarde ce que fait ce code, tu comprendras mieux:
en plus j'ai pas vu le (2)
Si il n'y a qu'un espace, tu ne verras jamais le 2, ça buguera!!!!!!!!!!
@+ Le Pivert
Que cherches-tu à faire?
Regarde ce que fait ce code, tu comprendras mieux:
Option Explicit
Private Sub CommandButton1_Click()
Dim Tableau() As String
Dim nom As String
Dim FL1 As Worksheet, NoCol, i As Integer
Dim NoLig As Long, Var As Variant
Set FL1 = Worksheets("Feuil1")
NoCol = 2 'lecture de la colonne B
For NoLig = 1 To Split(FL1.UsedRange.Address, "$")(4)
Var = FL1.Cells(NoLig, NoCol)
'découpe la chaine en fonction des espaces " "
'le résultat de la fonction Split est stocké dans un tableau
Tableau = Split(Var, " ")
For i = 0 To UBound(Tableau)
Debug.Print Tableau(i)
Next i
nom = Tableau(0) '1èrechaine = S/Total
If nom = "S/Total" Then
MsgBox Tableau(1) '2ème chaine = R2017/00027
' Range("B" & NoLig - 3).Copy ActiveSheet.Range("B" & NoLig) 'copier coller
'Application.CutCopyMode = False
End If
Next
Set FL1 = Nothing
End Sub
en plus j'ai pas vu le (2)
Si il n'y a qu'un espace, tu ne verras jamais le 2, ça buguera!!!!!!!!!!
@+ Le Pivert
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
1
30 nov. 2017 à 18:36
30 nov. 2017 à 18:36
En gros ce que je cherche a faire, c'est que la macro descende la colonne b est quand elle trouve dans une cellule la chaine de caractères " S/Total R2017", elle remplace dans cette cellule par le nom de la cellule situé 3 ligne au dessus. et ca s'arrte quand elle arrive à la fin de la colonne, des qu'(ily a une cellule vide.
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
Modifié le 30 nov. 2017 à 19:10
Modifié le 30 nov. 2017 à 19:10
Et cela ne suffit pas?
Tu as "S/Total" autre que R2017?
https://forums.commentcamarche.net/forum/affich-35036430-besoin-d-une-macro-loop#5
@+ Le Pivert
Tu as "S/Total" autre que R2017?
https://forums.commentcamarche.net/forum/affich-35036430-besoin-d-une-macro-loop#5
@+ Le Pivert
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
30 nov. 2017 à 19:50
30 nov. 2017 à 19:50
Voilà une autre version de Split avec comme séparateur "/"
Option Explicit
Private Sub CommandButton1_Click()
Dim Tableau() As String
Dim nom As String
Dim nom_2 As String
Dim FL1 As Worksheet, NoCol, i As Integer
Dim NoLig As Long, Var As Variant
Set FL1 = Worksheets("Feuil1")
NoCol = 2 'lecture de la colonne B
For NoLig = 1 To Split(FL1.UsedRange.Address, "$")(4)
Var = FL1.Cells(NoLig, NoCol)
'découpe la chaine en fonction des "/"
'le résultat de la fonction Split est stocké dans un tableau
Tableau = Split(Var, "/")
For i = 0 To UBound(Tableau)
Debug.Print Tableau(i)
Next i
nom = Tableau(0) '1èrechaine = S
If nom = "S" Then
nom_2 = Tableau(1) '2ème chaine = Total R2017
If nom_2 = "Total R2017" Then
Range("B" & NoLig - 3).Copy ActiveSheet.Range("B" & NoLig) 'copier coller
Application.CutCopyMode = False
End If
End If
Next
Set FL1 = Nothing
End Sub
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
1
1 déc. 2017 à 09:34
1 déc. 2017 à 09:34
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
1 déc. 2017 à 11:55
1 déc. 2017 à 11:55
Pour l'erreur met des MsgBox pour voir comme ceci:
Var = FL1.Cells(NoLig, NoCol)
MsgBox Var
'découpe la chaine en fonction des "/"
'le résultat de la fonction Split est stocké dans un tableau
Tableau = Split(Var, "/")
For i = 0 To UBound(Tableau)
Debug.Print Tableau(i)
Next i
nom = Tableau(0) '1èrechaine = S
MsgBox nom
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
Modifié le 1 déc. 2017 à 09:47
Modifié le 1 déc. 2017 à 09:47
le boucle parcourt les cellules
var est le texte dans chaque cellule parcourue
quand il arrive sur une cellule qui contient le séparateur, en l’occurrence ici: "/", Split la décompose en un tableau
S/Total R2017/00027
ici il y a 2 séparateurs et 3 chaines à décomposer
Tableau
0 = S
1 = Total R2017
2 = 00027
donc quand on trouve Total R2017 on a la ligne et il suffit de faire un copier coller
C'est simple!!!!!!!!!!
@+ Le Pivert
var est le texte dans chaque cellule parcourue
quand il arrive sur une cellule qui contient le séparateur, en l’occurrence ici: "/", Split la décompose en un tableau
S/Total R2017/00027
ici il y a 2 séparateurs et 3 chaines à décomposer
Tableau
0 = S
1 = Total R2017
2 = 00027
donc quand on trouve Total R2017 on a la ligne et il suffit de faire un copier coller
C'est simple!!!!!!!!!!
@+ Le Pivert
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
1
1 déc. 2017 à 15:24
1 déc. 2017 à 15:24
Je vais te payer pour quelques cours lol, mais expliquer comme ca j'ai compris ce que tu me dit, meme si je vois pas l'interet de decomposer en tableau. j'aurai jamais penser a utiliser split et var, du coup je me dis juste que je suis loin. Le probleme la c'est juste que l'occurence tableau (0) bloque la macro c'est tout. En tous cas merci d'avoir pris de ton temps
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
1
1 déc. 2017 à 15:32
1 déc. 2017 à 15:32
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
Modifié le 1 déc. 2017 à 15:50
Modifié le 1 déc. 2017 à 15:50
Cela vient peut-être de la boucle, essaie ceci:
meme si je vois pas l'interet de decomposer en tableau
comment fais-tu pour déterminer la présence de:
S/Total R2017 ?????
par contre si tu avais voulu trouver:
S/Total R2017/00027
pas de tableau
Var aurait suffit!!!!!!!!
@+ Le Pivert
Option Explicit
Private Sub CommandButton1_Click()
Dim Tableau() As String
Dim nom As String
Dim nom_2 As String
Dim FL1 As Worksheet, NoCol, i As Integer
Dim NoLig As Long, Var As Variant
Dim DernLigne As Long
DernLigne = Range("B1048576").End(xlUp).Row
Set FL1 = Worksheets("Feuil1")
NoCol = 2 'lecture de la colonne B
For NoLig = 1 To DernLigne
Var = FL1.Cells(NoLig, NoCol)
'découpe la chaine en fonction des espaces "/"
'le résultat de la fonction Split est stocké dans un tableau
Tableau = Split(Var, "/")
For i = 0 To UBound(Tableau)
Debug.Print Tableau(i)
Next i
nom = Tableau(0) '1èrechaine = S
If nom = "S" Then
nom_2 = Tableau(1) '2ème chaine = Total R2017
If nom_2 = "Total R2017" Then
Range("B" & NoLig - 3).Copy ActiveSheet.Range("B" & NoLig) 'copier coller
Application.CutCopyMode = False
End If
End If
Next
Set FL1 = Nothing
End Sub
meme si je vois pas l'interet de decomposer en tableau
comment fais-tu pour déterminer la présence de:
S/Total R2017 ?????
par contre si tu avais voulu trouver:
S/Total R2017/00027
pas de tableau
Var aurait suffit!!!!!!!!
@+ Le Pivert
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
1
1 déc. 2017 à 16:12
1 déc. 2017 à 16:12
je pensais pouvoir utiliser une fonction excel genre Len un truc comme ça, mais si tu l'as fait c'est que ca doit être ca, encore une fois je suis un petit débutant malheureusement, j'aimerai bien qu'on puisse faire comme dans matrix.
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
Modifié le 1 déc. 2017 à 16:28
Modifié le 1 déc. 2017 à 16:28
Tu as tout a fait raison, on peut le faire autrement avec Left
Il n'y a que les imbéciles qui ne changent pas d'avis!
A méditer
Et pour faire un peu d'esprit, je dirais que la boucle est bouclée LOL
@+ Le Pivert
Il n'y a que les imbéciles qui ne changent pas d'avis!
A méditer
Option Explicit
Private Sub CommandButton1_Click()
Dim Tableau() As String
Dim nom As String
Dim FL1 As Worksheet, NoCol, i As Integer
Dim NoLig As Long, Var As Variant
Dim DernLigne As Long
DernLigne = Range("B1048576").End(xlUp).Row
Set FL1 = Worksheets("Feuil1")
NoCol = 2 'lecture de la colonne B
For NoLig = 1 To DernLigne
Var = FL1.Cells(NoLig, NoCol)
nom = Left(Var, 13)
If nom = "S/Total R2017" Then
Range("B" & NoLig - 3).Copy ActiveSheet.Range("B" & NoLig) 'copier coller
Application.CutCopyMode = False
End If
Next
Set FL1 = Nothing
End Sub
Et pour faire un peu d'esprit, je dirais que la boucle est bouclée LOL
@+ Le Pivert
salsero75014
Messages postés
32
Date d'inscription
mercredi 29 novembre 2017
Statut
Membre
Dernière intervention
11 mai 2018
1
1 déc. 2017 à 17:48
1 déc. 2017 à 17:48
mdrrr, bien vu.
Voila j'etais plus sur une idée comme ça du coup ca marche, c'est top merci :)
Voila j'etais plus sur une idée comme ça du coup ca marche, c'est top merci :)