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
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Macro word - Guide
- Macro logiciel - Télécharger - Organisation
- Jitbit macro recorder - Télécharger - Confidentialité
- Telecharger macro nblettre.xla - Forum Bureautique
20 réponses
cs_Le Pivert
Messages postés
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
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
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
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
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
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
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
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
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
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
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
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
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
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
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
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
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
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
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
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
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
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 :)