Macro dupliquant une ligne si une cellule contient tel caractère
Résolu/Fermé
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
-
4 sept. 2014 à 16:25
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020 - 9 févr. 2015 à 17:44
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020 - 9 févr. 2015 à 17:44
Bonjour,
Je reviens vers vous pour un problème dont je ne maitrise pas du tout la résolution !
Il s'agit de créer un script VBA qui effectuerait l'action suivante sur la même feuille :
Partir de la ligne 2
Si en A2 figure le mot "MOT_1" ajouter au mot de B2 le suffixe "_A"
Puis copier toute la ligne et l'insérer en dessous
Et ajouter au mot de B3 de la ligne collée le suffixe "_B"
Puis rechercher ainsi de suite tous les mots "MOT_1" dans les lignes suivantes de la colonne A et répéter l'opération...
Pour les suffixes, je ne sais pas ce qui est le plus logique, ou simple
Copier la ligne avant de la dupliquer puis renommer B2
Ou remplacer le "_A" de B3 par "_B" ?
Merci
Lo.
Je reviens vers vous pour un problème dont je ne maitrise pas du tout la résolution !
Il s'agit de créer un script VBA qui effectuerait l'action suivante sur la même feuille :
Partir de la ligne 2
Si en A2 figure le mot "MOT_1" ajouter au mot de B2 le suffixe "_A"
Puis copier toute la ligne et l'insérer en dessous
Et ajouter au mot de B3 de la ligne collée le suffixe "_B"
Puis rechercher ainsi de suite tous les mots "MOT_1" dans les lignes suivantes de la colonne A et répéter l'opération...
Pour les suffixes, je ne sais pas ce qui est le plus logique, ou simple
Copier la ligne avant de la dupliquer puis renommer B2
Ou remplacer le "_A" de B3 par "_B" ?
Merci
Lo.
A voir également:
- Vba insérer une ligne si cellule contient
- Si cellule contient texte alors ✓ - Forum Excel
- Aller à la ligne dans une cellule excel - Guide
- Excel si cellule contient partie texte ✓ - Forum Excel
- Insérer une vidéo sur powerpoint - Guide
- Excel cellule couleur si condition texte - Guide
17 réponses
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
Modifié par pijaku le 18/09/2014 à 14:32
Modifié par pijaku le 18/09/2014 à 14:32
Bonsoir dhaze,
Essaie cette macro
Cdlmnt
"L'imagination est plus importante que le savoir." A. Einstein
Essaie cette macro
Sub ajout() Dim DernLigne As Long DernLigne = Range("A" & Rows.Count).End(xlUp).Row For n = DernLigne To 2 Step -1 If Range("A" & n) = "MOT_1" Then Rows(n & ":" & n).Select Application.CutCopyMode = False Selection.Copy Selection.Insert Shift:=xlDown Range("B" & n).Select ActiveCell.FormulaR1C1 = Range("B" & n).Value & "_A" Range("B" & n + 1).Select ActiveCell.FormulaR1C1 = Range("B" & n + 1).Value & "_B" End If Next End Sub
Cdlmnt
"L'imagination est plus importante que le savoir." A. Einstein
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
Modifié par dhaze le 17/09/2014 à 18:08
Modifié par dhaze le 17/09/2014 à 18:08
Il y a dans la copie complète de la ligne des informations redondantes dans certaines colonnes.
Peut-on par exemple exclure certaines colonnes de la copie afin d'avoir une cellule vide après collage et/ou y ajouter un caractère générique ?
Et suite dans cette macro, peut-on recombiner les colonnes (Ex: A en Y et B en P etc...) sur une nouvelle veuille ?
Peut-on par exemple exclure certaines colonnes de la copie afin d'avoir une cellule vide après collage et/ou y ajouter un caractère générique ?
Et suite dans cette macro, peut-on recombiner les colonnes (Ex: A en Y et B en P etc...) sur une nouvelle veuille ?
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
17 sept. 2014 à 21:03
17 sept. 2014 à 21:03
Re,
quelles sont les colonnes à exclure ?
quelle caractère générique est à inscrire et où
je ne comprends pas ce que tu entends par "recombiner A en Y " ?? tu veux dire les placer dans un autre ordre sur une nouvelle feuille ?
si c'est cela c'est possible à condition de savoir exactement pour chaque colonne où la mettre
Cdlmnt
quelles sont les colonnes à exclure ?
quelle caractère générique est à inscrire et où
je ne comprends pas ce que tu entends par "recombiner A en Y " ?? tu veux dire les placer dans un autre ordre sur une nouvelle feuille ?
si c'est cela c'est possible à condition de savoir exactement pour chaque colonne où la mettre
Cdlmnt
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
Modifié par pijaku le 18/09/2014 à 14:32
Modifié par pijaku le 18/09/2014 à 14:32
Bonjour,
Oui, j'ai adapté ta macro comme cela :
Et dans la recopie des lignes je souhaite exclure les colonnes A à G, donc vides et ajouter un # dans les colonnes A et F.
Puis, la création de la deuxième feuille en reportant certaines colonnes, je ne sais pas encore combien de colonnes viendraient s'intercaler entre G et Y.
Mais ce sera bien une recopie des colonnes A à H sûr, et Y en "quelque-chose"...
Lo.
Oui, j'ai adapté ta macro comme cela :
Sub SiMonofaceDupliquerLigne() Dim DernLigne As Long DernLigne = Range("P" & Rows.Count).End(xlUp).Row For n = DernLigne To 2 Step -1 If Range("P" & n) = "Monoface" Then Rows(n & ":" & n).Select Application.CutCopyMode = False Selection.Copy Selection.Insert Shift:=xlDown Range("Y" & n).Select ActiveCell.FormulaR1C1 = Range("Y" & n).Value & "_A" Range("Y" & n + 1).Select ActiveCell.FormulaR1C1 = Range("Y" & n + 1).Value & "_B" End If Next End Sub
Et dans la recopie des lignes je souhaite exclure les colonnes A à G, donc vides et ajouter un # dans les colonnes A et F.
Puis, la création de la deuxième feuille en reportant certaines colonnes, je ne sais pas encore combien de colonnes viendraient s'intercaler entre G et Y.
Mais ce sera bien une recopie des colonnes A à H sûr, et Y en "quelque-chose"...
Lo.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
Modifié par pijaku le 18/09/2014 à 14:32
Modifié par pijaku le 18/09/2014 à 14:32
Bonjour
Si j'ai bien compris, rajoutes ces lignes juste après Selection.Insert Shift:=xlDown dans la macro :
Pour la recopie sur une autre feuille il faut prévoir une macro de ce style
A adapter avec le nom des feuilles et les bonnes colonnes
Cdlmnt
"L'imagination est plus importante que le savoir." A. Einstein
Si j'ai bien compris, rajoutes ces lignes juste après Selection.Insert Shift:=xlDown dans la macro :
Range("A" & n + 1 & ":G" & n + 1).Select
Selection.ClearContents
Range("A" & n + 1) = "#"
Range("F" & n + 1) = "#"
Pour la recopie sur une autre feuille il faut prévoir une macro de ce style
Sub recopie() Sheets("Feuil1").Select Columns("A:H").Select Selection.Copy Sheets("Feuil2").Select Range("A1").Select ActiveSheet.Paste Sheets("Feuil1").Select Columns("Y:Y").Select Selection.Copy Sheets("Feuil2").Select Range("Y1").Select ActiveSheet.Paste End Sub
A adapter avec le nom des feuilles et les bonnes colonnes
Cdlmnt
"L'imagination est plus importante que le savoir." A. Einstein
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
18 sept. 2014 à 17:30
18 sept. 2014 à 17:30
Oui ! Tu as bien compris, encore une réussite :-)
Pour la recopie je voulais faire un .PasteSpecial Paste:=xlPasteValues
mais je ne sais pas comment l'intégrer, tel que ça ne lui plait pas...
Je voulais aussi exclure du copier/coller les en-têtes de colonnes.
Je sais, parfois je suis en peu ch...te ;-)
Pour la recopie je voulais faire un .PasteSpecial Paste:=xlPasteValues
mais je ne sais pas comment l'intégrer, tel que ça ne lui plait pas...
Je voulais aussi exclure du copier/coller les en-têtes de colonnes.
Je sais, parfois je suis en peu ch...te ;-)
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
18 sept. 2014 à 18:52
18 sept. 2014 à 18:52
Re,
1) pour exclure les entêtes il faut spécifier la plage de copie et au lieu de Columns("A:H").Select mettre par ex: Range("A2:H100").Select
2) Pour collage spécial valeur remplacer ActiveSheet.Paste par : Selection.PasteSpecial Paste:=xlPasteValues
Cdlmnt
1) pour exclure les entêtes il faut spécifier la plage de copie et au lieu de Columns("A:H").Select mettre par ex: Range("A2:H100").Select
2) Pour collage spécial valeur remplacer ActiveSheet.Paste par : Selection.PasteSpecial Paste:=xlPasteValues
Cdlmnt
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
19 sept. 2014 à 11:34
19 sept. 2014 à 11:34
Bonjour,
A la place de H100, peut-on spécifier une fin de colonne avec une commande du genre : End(xlDown) ?
A la place de H100, peut-on spécifier une fin de colonne avec une commande du genre : End(xlDown) ?
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
19 sept. 2014 à 15:56
19 sept. 2014 à 15:56
Bonjour
Oui bien sur, tu récupères la dernière ligne non vide de la colonne H avec
DernLigne = Range("H" & Rows.Count).End(xlUp).Row (en ayant avant dimensionné la variable en début de macro par Dim DernLigne As Long )
et tu selectionnes la plage ensuite avec Range("A2:H" & DernLigne).Select
Cdlmnt
Oui bien sur, tu récupères la dernière ligne non vide de la colonne H avec
DernLigne = Range("H" & Rows.Count).End(xlUp).Row (en ayant avant dimensionné la variable en début de macro par Dim DernLigne As Long )
et tu selectionnes la plage ensuite avec Range("A2:H" & DernLigne).Select
Cdlmnt
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 753
18 sept. 2014 à 14:33
18 sept. 2014 à 14:33
Bonjour,
Lorsque vous placez du code sur notre forum, merci d'utiliser les balises code à votre disposition.
Le mode d'emploi (au cas ou) est ICI.
Lorsque vous placez du code sur notre forum, merci d'utiliser les balises code à votre disposition.
Le mode d'emploi (au cas ou) est ICI.
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
22 sept. 2014 à 11:25
22 sept. 2014 à 11:25
J'ai encore pas mal d'interrogations sur la création d'une nouvelle feuille avec quelques spécificités prédéfinies...
Mais j'ouvrirais un nouveau sujet pour cela.
Pour l'instant, en ce qui me concerne, ce sujet est bien résolu.
Et au vu de l'aide précieuse qui m'a été apportée ici,
je ne pouvais décemment pas ne pas prendre un peu de temps pour remercier
les contributeurs de ce forum. Et tout particulièrement via55.
Sans oublier l'indulgence bienveillante du modérateur...
Mes compétences ne me permettent pas encore de pouvoir apporter ma pierre à cette édifice. Mais avec le temps et plus d'expérience, qui sait...
Encore un grand merci.
Lo.
Mais j'ouvrirais un nouveau sujet pour cela.
Pour l'instant, en ce qui me concerne, ce sujet est bien résolu.
Et au vu de l'aide précieuse qui m'a été apportée ici,
je ne pouvais décemment pas ne pas prendre un peu de temps pour remercier
les contributeurs de ce forum. Et tout particulièrement via55.
Sans oublier l'indulgence bienveillante du modérateur...
Mes compétences ne me permettent pas encore de pouvoir apporter ma pierre à cette édifice. Mais avec le temps et plus d'expérience, qui sait...
Encore un grand merci.
Lo.
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
24 nov. 2014 à 16:44
24 nov. 2014 à 16:44
Salut à vous.
Je reviens sur cette macro...
C'était trop beau pour durer !
Les tableaux que l'on me fournit n'ont pas toujours la valeur "Monoface" dans la colonne "P" et le nom à modifier en "Y".
Peut-on sélectionner ces colonnes par la valeur de leurs en-têtes, en l'occurrence "Face" et "Nom de fichier", qui sont quelque part ligne 1 ?
Et petite subtilité, en dupliquant la ligne, renommée "Monoface" en "A" pour la première ligne et "B" pour la seconde.
Revoici la macro telle que je l'utilise :
Par ailleurs.
J'ai trouvé chez Microsoft un petit code que je voudrais pouvoir
Utiliser en le modifiant sur la même principe.
Est-ce possible ?
Lo.
Je reviens sur cette macro...
C'était trop beau pour durer !
Les tableaux que l'on me fournit n'ont pas toujours la valeur "Monoface" dans la colonne "P" et le nom à modifier en "Y".
Peut-on sélectionner ces colonnes par la valeur de leurs en-têtes, en l'occurrence "Face" et "Nom de fichier", qui sont quelque part ligne 1 ?
Et petite subtilité, en dupliquant la ligne, renommée "Monoface" en "A" pour la première ligne et "B" pour la seconde.
Revoici la macro telle que je l'utilise :
Sub Si_monoface_dupliquer_ligne() Dim DernLigne As Long DernLigne = Range("P" & Rows.Count).End(xlUp).Row For n = DernLigne To 2 Step -1 If Range("P" & n) = "Monoface" Then Rows(n & ":" & n).Select Application.CutCopyMode = False Selection.Copy Selection.Insert Shift:=xlDown Selection.Insert Shift:=xlDown Range("A" & n + 1 & ":G" & n + 1).Select Selection.ClearContents Range("A" & n + 1) = "#" Range("F" & n + 1) = "#" Range("Y" & n).Select ActiveCell.FormulaR1C1 = Range("Y" & n).Value & "_A" Range("Y" & n + 1).Select ActiveCell.FormulaR1C1 = Range("Y" & n + 1).Value & "_B" End If Next End Sub
Par ailleurs.
J'ai trouvé chez Microsoft un petit code que je voudrais pouvoir
Utiliser en le modifiant sur la même principe.
Est-ce possible ?
StartRange = "P1" 'remplacer par valeur d'entête colone à copier EndRange = "Y1" 'idem Set a = Range(StartRange, Range(StartRange).End(xlDown)) Set b = Range(EndRange, Range(EndRange).End(xlDown)) Union(a, b).Select
Lo.
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
24 nov. 2014 à 19:54
24 nov. 2014 à 19:54
Bonsoir
Remplaces ta macro par celle ci
mais je ne comprends pas pourquoi les A et B sont décalés d'une ligne par rapport à Monoface; c'était comme cela dans ta macro d'origine je n'ai pas modifié
Par contre je ne saisis pas ce que tu veux dire par Et petite subtilité, en dupliquant la ligne, renommée "Monoface" en "A" pour la première ligne et "B" pour la seconde. Peux tu être plus explicite
Cdlmnt
Remplaces ta macro par celle ci
Sub Si_monoface_dupliquer_ligne() Dim ColF As Integer Dim colN As Integer ColF = Rows(1).Find("Face", , , , xlByRows, xlPrevious).Column colN = Rows(1).Find("Nom de fichier", , , , xlByRows, xlPrevious).Column Dim DernLigne As Long DernLigne = Columns(ColF).Find("*", , , , xlByColumns, xlPrevious).Row For n = DernLigne To 2 Step -1 If Cells(n, ColF) = "Monoface" Then Rows(n & ":" & n).Select Application.CutCopyMode = False Selection.Copy Selection.Insert Shift:=xlDown Selection.Insert Shift:=xlDown Range("A" & n + 1 & ":G" & n + 1).Select Selection.ClearContents Range("A" & n + 1) = "#" Range("F" & n + 1) = "#" Cells(n, colN).Select ActiveCell.FormulaR1C1 = Cells(n, colN).Value & "_A" Cells(n + 1, colN).Select ActiveCell.FormulaR1C1 = Cells(n + 1, colN).Value & "_B" End If Next End Sub
mais je ne comprends pas pourquoi les A et B sont décalés d'une ligne par rapport à Monoface; c'était comme cela dans ta macro d'origine je n'ai pas modifié
Par contre je ne saisis pas ce que tu veux dire par Et petite subtilité, en dupliquant la ligne, renommée "Monoface" en "A" pour la première ligne et "B" pour la seconde. Peux tu être plus explicite
Cdlmnt
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
25 nov. 2014 à 11:38
25 nov. 2014 à 11:38
Bonjour Via55,
Oui, déjà il y a une petite coquille dans mon post,
en recopiant la macro il y a deux fois la ligne:
En la supprimant, ça fonctionne parfaitement.
Pour répondre à ta question
Cette macro traite les monofaces en en faisant de double faces.
Dans ce tableau il y a des lignes doubles (A et B en "P", "*_A" et "*_B" en "Y") qui sont exclus par la macro. Et dont le nom en "Y" n'a pas d'extension "_A" ou "_B". Ce que la macro ajoute aussi.
Le but est que dans la colonne "P", puisque la ligne est dupliquée pour avoir une deuxième face, il faudrait remplacer "Monoface" par "A" dans la première ligne et "B" dans la second (celle dupliquée).
Ainsi il n'y aurait plus que des double faces, celle existantes, plus les monos dupliquées...
Oui, déjà il y a une petite coquille dans mon post,
en recopiant la macro il y a deux fois la ligne:
"Selection.Insert Shift:=xlDown"
En la supprimant, ça fonctionne parfaitement.
Pour répondre à ta question
Cette macro traite les monofaces en en faisant de double faces.
Dans ce tableau il y a des lignes doubles (A et B en "P", "*_A" et "*_B" en "Y") qui sont exclus par la macro. Et dont le nom en "Y" n'a pas d'extension "_A" ou "_B". Ce que la macro ajoute aussi.
Le but est que dans la colonne "P", puisque la ligne est dupliquée pour avoir une deuxième face, il faudrait remplacer "Monoface" par "A" dans la première ligne et "B" dans la second (celle dupliquée).
Ainsi il n'y aurait plus que des double faces, celle existantes, plus les monos dupliquées...
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
25 nov. 2014 à 13:14
25 nov. 2014 à 13:14
Bonjour dhaze
Ok alors si j'ai bien compirs, il te suffit de rajouter 2 lignes avant le End if :
Cells(n, ColF) = "A"
Cells(n+1, ColF) = "B"
Cdlmnt
Ok alors si j'ai bien compirs, il te suffit de rajouter 2 lignes avant le End if :
Cells(n, ColF) = "A"
Cells(n+1, ColF) = "B"
Cdlmnt
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
25 nov. 2014 à 17:52
25 nov. 2014 à 17:52
Concis et efficace, j'allais dire comme toujours ! ;-)
Je m'incline respectueusement. Bonne soirée à toi.
Et merci.
Lo.
Je m'incline respectueusement. Bonne soirée à toi.
Et merci.
Lo.
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
26 nov. 2014 à 18:38
26 nov. 2014 à 18:38
Bonjour Via55,
Ton .Find() m'a bien trotter dans la tête, et je me disais...
Puis-je l'utiliser pour améliorer ma sélection de colonne ?
Au lieu d'un :
Remplacer "H1" par un Find dans Range(1:1) valeur="Un Mot"
Mais je ne sais pas comment le formuler.
Tout ce que j'ai pu lire sur les sélections de plages ou de "Find"
ne m'ont pas éclairé sur une solution de ce genre.
Bonne soirée.
Lo.
Ton .Find() m'a bien trotter dans la tête, et je me disais...
Puis-je l'utiliser pour améliorer ma sélection de colonne ?
Au lieu d'un :
ActiveSheet.Range(ActiveSheet.Range("A65536").End(xlUp), "H1").Select
Remplacer "H1" par un Find dans Range(1:1) valeur="Un Mot"
Mais je ne sais pas comment le formuler.
Tout ce que j'ai pu lire sur les sélections de plages ou de "Find"
ne m'ont pas éclairé sur une solution de ce genre.
Bonne soirée.
Lo.
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
26 nov. 2014 à 18:56
26 nov. 2014 à 18:56
Bonsoir Dhaze
Essaie ceci:
Cdlmnt
Essaie ceci:
Dim a As Integer a = Rows(1).Find("Face", , , , xlByRows, xlPrevious).Column ' cherche la colonne où est Face en ligne 1 A ADAPTER ActiveSheet.Range(ActiveSheet.Range("A65536").End(xlUp), Cells(1, a)).Select
Cdlmnt
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
28 nov. 2014 à 14:19
28 nov. 2014 à 14:19
Via55 merci, grâce à ton aide le post traitement de mono faces fonctionne.
La réplication partielle du tableau aussi.
Je dois l'enrichir de colonnes systématiques.
Existe-il une solution en VBA pour appliquer dans des cellules une liste de cette forme :
Appliquer dans :
Répliquer jusqu'a .End(xlDown) de la colonne précédant .Select
Bon WE
Lo.
'Voir ci-dessus précédemment
La réplication partielle du tableau aussi.
Sub Photo() Dim Valeur_Fin As Integer 'Valeur "Nom de fichier" Call Si_trouve_monoface_dupliquer_ligne 'Duplication des monofaces en A et B ' Création des nouvelles feuilles spécifiques à la prise de vue Sheets.Add.Move After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "Tableau Photo" Sheets.Add.Move After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "PV via WIA" ' Sélection et copie des colonnes de base du tableau d'origine Sheets("Modèle").Select Valeur_Fin = Rows(1).Find("Nom de fichier", , , , xlByRows, xlPrevious).Column ActiveSheet.Range(ActiveSheet.Range("A65536").End(xlUp), Cells(1, Valeur_Fin)).Select Selection.Copy ' Recopie dans la nouvelle feuille Sheets("Tableau Photo").Select Range("A1").Select ActiveSheet.Paste Selection.PasteSpecial Paste:=xlPasteColumnWidths ActiveSheet.Paste Call Formatage_des_cellules 'Format des cellules (Style et couleurs) ' Création des nouvelles colonnes de données Sheets("Tableau Photo").Select Range("A1").End(xlToRight).Offset(0, 1).Select End Sub
Je dois l'enrichir de colonnes systématiques.
Existe-il une solution en VBA pour appliquer dans des cellules une liste de cette forme :
LISTE
Titre_Col_X, Val_Col_X
Titre_Col_Y, Val_Col_Y
Titre_Col_Z, Val_Col_Z
Etc...
/LISTE
Appliquer dans :
Range("A1").End(xlToRight).Offset(0, 1).Select
+---+-------------+-------------+-------------+
| | X (Select) | Y | Z |
+---+-------------+-------------+-------------+
| 1 | Titre_Col_X | Titre_Col_X | Val_Col_X |
+---+-------------+-------------+-------------+
| 2 | Val_Col_X | Val_Col_X | Val_Col_X |
+---+-------------+-------------+-------------+
| 3 | Val_Col_X | Val_Col_X | Val_Col_X |
+---+-------------+-------------+-------------+
Etc...
Répliquer jusqu'a .End(xlDown) de la colonne précédant .Select
Bon WE
Lo.
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
28 nov. 2014 à 15:14
28 nov. 2014 à 15:14
Bonjour Dhaze
Si j'ai bien compris ta demande, en ayant dans une autre feuille la liste des titres des nouvelles colonnes et en face la valeur à mettre dans toute la colonne :
Bon WE également
Cdlmnt
Si j'ai bien compris ta demande, en ayant dans une autre feuille la liste des titres des nouvelles colonnes et en face la valeur à mettre dans toute la colonne :
ActiveSheet.Range("A1").End(xlToRight).Offset(0, 1).Select 'dernière colonne remplie Dim DernCol As Integer DernCol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column ' derniere ligne remplie de cette colonne Dim Ligne As Long Ligne = Columns(DernCol).Find("*", , , , xlByColumns, xlPrevious).Row ' nombre de colonnes à créer nbcol = 3 ' A ADAPTER ' remplissage des colonnes For n = 1 To nbcol 'titre en 1ere ligne récupéré en A1,A2 etc d'une feuille nommée DATA Cells(1, DernCol + n) = Sheets("DATA").Range("A" & n) For x = 2 To Ligne ' valeur dans les x lignes récupérée en B1, B2 etc de DATA Cells(x, DernCol + n) = Sheets("DATA").Range("B" & n) Next x Next n
Bon WE également
Cdlmnt
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
Modifié par dhaze le 28/11/2014 à 16:58
Modifié par dhaze le 28/11/2014 à 16:58
Presque :-)
Je me demandais s'il on ne pouvait pas tout simplement "écrire" les valeurs dans le tableau directement depuis code VBA ?
La liste est dans la Sub.
Je me demandais s'il on ne pouvait pas tout simplement "écrire" les valeurs dans le tableau directement depuis code VBA ?
La liste est dans la Sub.
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
>
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
28 nov. 2014 à 17:15
28 nov. 2014 à 17:15
Dans ce cas tu déclares les variables en début de macro et tu modifies les dernières lignes ainsi :
Cdlmnt
Dim titre(3) Dim valeur(3) 'pour 3 titres, A ADAPTER ' Liste A ADAPTER titre(1) = "Titre 1..." titre(2) = "Titre 2..." titre(3) = "Titre 3..." valeur(1) = "Valeur 1 ..." valeur(2) = "Valeur 2 ..." valeur(3) = "Valeur 3 ..." ActiveSheet.Range("A1").End(xlToRight).Offset(0, 1).Select 'dernière colonne remplie Dim DernCol As Integer DernCol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column ' derniere ligne remplie de cette colonne Dim Ligne As Long Ligne = Columns(DernCol).Find("*", , , , xlByColumns, xlPrevious).Row ' nombre de colonnes à créer nbcol = 3 For n = 1 To nbcol 'titre en 1ere ligne récupéré en A1,A2 etc d'une feuille nommée DATA Cells(1, DernCol + n) = titre(n) For x = 2 To Ligne ' valeur dans les x lignes récupérée en B1, B2 etc de DATA Cells(x, DernCol + n) = valeur(n) Next x Next n
Cdlmnt
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
>
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
28 nov. 2014 à 18:43
28 nov. 2014 à 18:43
Hallucinant, je suis admirative...
Me sens toute petite :-(
Bon, cette fois-ci, part en WE.
Merci... Et à lundi ! :-D
Lo.
Me sens toute petite :-(
Bon, cette fois-ci, part en WE.
Merci... Et à lundi ! :-D
Lo.
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
>
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
28 nov. 2014 à 18:54
28 nov. 2014 à 18:54
Content que ça te convienne
Si le nombre de colonnes à créer est fixe tu peux supprimer la ligne nbcol=3 et remplacer nbcol par le nombre dans For n=1 to nbcol
@+ ;)
Si le nombre de colonnes à créer est fixe tu peux supprimer la ligne nbcol=3 et remplacer nbcol par le nombre dans For n=1 to nbcol
@+ ;)
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
9 déc. 2014 à 19:21
9 déc. 2014 à 19:21
Coucou, la revoilà :-)
Cette fois, je pensais m'en sortir seule...
Mais ça ne fonctionne pas.
Alors, je me suis dit (à regret ;-), je vais en parler à mon débogueur préféré !
Une idée ?
Cette fois, je pensais m'en sortir seule...
Mais ça ne fonctionne pas.
Alors, je me suis dit (à regret ;-), je vais en parler à mon débogueur préféré !
Sub Verif() Application.ScreenUpdating = False Dim formule_verif As Integer formule_verif = Rows(1).Find("Vérif", , , , xlByRows, xlPrevious).Column Dim Der_Ligne As Long Der_Ligne = Columns(formule_verif).Find("*", , , , xlByColumns, xlPrevious).Row For n = Der_Ligne To 2 Step -1 Rows(n & ":" & n).Select ActiveCell.FormulaR1C1 = "=IF(R[0]C[-2]=R[0]C[-1],""OK"",""!!!"")" If cell = "OK" Then cell.Interior.ColorIndex = 4 ElseIf cell = "!!!" Then cell.Interior.ColorIndex = 3 End If Next Application.ScreenUpdating = True End Sub
Une idée ?
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
Modifié par via55 le 9/12/2014 à 20:28
Modifié par via55 le 9/12/2014 à 20:28
Bonsoir Dhaze
Tu n'indiques pas quelle cellule doit avoir OK
If cell = "OK" Then
c'est soit If cells (x,y)="OK" avec le n° de ligne en variable x et le n° de colonne en variable y
soit If Activecell="OK" pour la cellule active
Plutôt celle-là don dans ton cas
et pour ne mettre l'activecell qu'une fois tu peux utiliser With (dans les instructions qui suivent le. en début indique d'y ajoindre avant Activecell:
Cdlmnt
"L'imagination est plus importante que le savoir." A. Einstein
Tu n'indiques pas quelle cellule doit avoir OK
If cell = "OK" Then
c'est soit If cells (x,y)="OK" avec le n° de ligne en variable x et le n° de colonne en variable y
soit If Activecell="OK" pour la cellule active
Plutôt celle-là don dans ton cas
et pour ne mettre l'activecell qu'une fois tu peux utiliser With (dans les instructions qui suivent le. en début indique d'y ajoindre avant Activecell:
With ActiveCell .FormulaR1C1 = "=IF(R[0]C[-2]=R[0]C[-1],""OK"",""!!!"")" If .Value = "OK" Then .Interior.ColorIndex = 4 ElseIf cell = "!!!" Then .Interior.ColorIndex = 3 End If End With
Cdlmnt
"L'imagination est plus importante que le savoir." A. Einstein
Mytå
Messages postés
2973
Date d'inscription
mardi 20 janvier 2009
Statut
Contributeur
Dernière intervention
20 décembre 2016
951
9 déc. 2014 à 21:56
9 déc. 2014 à 21:56
Salut le Forum
Correction du code :
Mytå
Correction du code :
With ActiveCell
.FormulaR1C1 = "=IF(R[0]C[-2]=R[0]C[-1],""OK"",""!!!"")"
If .Value = "OK" Then
.Interior.ColorIndex = 4
ElseIf .Value = "!!!" Then
.Interior.ColorIndex = 3
End If
End With
Mytå
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
>
Mytå
Messages postés
2973
Date d'inscription
mardi 20 janvier 2009
Statut
Contributeur
Dernière intervention
20 décembre 2016
9 déc. 2014 à 22:21
9 déc. 2014 à 22:21
Merci Myta
En allant vite j'avais loupé un Activecell !!
En allant vite j'avais loupé un Activecell !!
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
10 déc. 2014 à 10:13
10 déc. 2014 à 10:13
Bonjour,
J'ai fait la modif, mais je pense qu'il y a un autre problème dans ce code.
Puisse que la colonne "Vérif" n'est pas encore remplie, mon "Der_Ligne" ne doit pas fonctionner. Faudrait y ajouter un "Offset(0, -1)" quelque part...
Pour la syntaxe, je cale.
Lo.
J'ai fait la modif, mais je pense qu'il y a un autre problème dans ce code.
Puisse que la colonne "Vérif" n'est pas encore remplie, mon "Der_Ligne" ne doit pas fonctionner. Faudrait y ajouter un "Offset(0, -1)" quelque part...
Pour la syntaxe, je cale.
Sub Verif() Dim formule_verif As Integer formule_verif = Rows(1).Find("Vérif", , , , xlByRows, xlPrevious).Column Dim Der_Ligne As Long Der_Ligne = Columns(formule_verif).Find("*", , , , xlByColumns, xlPrevious).Row 'Offset(0, -1) ??? For n = Der_Ligne To 2 Step -1 Rows(n & ":" & n).Select With ActiveCell .FormulaR1C1 = "=IF(R[0]C[-2]=R[0]C[-1],""OK"",""!!!"")" If .Value = "OK" Then .Interior.ColorIndex = 4 ElseIf .Value = "!!!" Then .Interior.ColorIndex = 3 End If End With Next End Sub
Lo.
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
10 déc. 2014 à 13:44
10 déc. 2014 à 13:44
Bonjour
Soit tu recherche la dernière ligne remplie sur une colonne qui elle contient des valeurs (dont tu mets le n° à la place de formule_verif dans l'instruction Columns
Soit tu sais que la dernière ligne est par exemple la 100 et tu construis ta boucle avec cela : For n=100 to 2 step -1
Cdlmnt
Soit tu recherche la dernière ligne remplie sur une colonne qui elle contient des valeurs (dont tu mets le n° à la place de formule_verif dans l'instruction Columns
Soit tu sais que la dernière ligne est par exemple la 100 et tu construis ta boucle avec cela : For n=100 to 2 step -1
Cdlmnt
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
>
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
12 déc. 2014 à 10:59
12 déc. 2014 à 10:59
Bonjour via55,
Je t'avoue, que j'ai un peu de mal avec cette macro...
Il y a une logique qui m'échappe.
Je voudrai que la boucle balaye la colonne "Vérif" en prenant comme référence de départ le même niveau de ligne (dernière non vide) que la cellule de la colonne qui est juste à ça gauche.
Comme la colonne "Vérif" est vide on ne peut pas le faire dans cette colonne.
Mais quand je tente de faire ça "j'arrose" d'autres colonnes !
Ou alors, rien ne se passe...
J'ai besoin d'un peu plus de détail, une décomposition "pédagogique" de cette macro, qui me fait tournée en bourrique. C'est le cas de la dire !
Merci.
Lo.
Je t'avoue, que j'ai un peu de mal avec cette macro...
Il y a une logique qui m'échappe.
Je voudrai que la boucle balaye la colonne "Vérif" en prenant comme référence de départ le même niveau de ligne (dernière non vide) que la cellule de la colonne qui est juste à ça gauche.
Comme la colonne "Vérif" est vide on ne peut pas le faire dans cette colonne.
Mais quand je tente de faire ça "j'arrose" d'autres colonnes !
Ou alors, rien ne se passe...
J'ai besoin d'un peu plus de détail, une décomposition "pédagogique" de cette macro, qui me fait tournée en bourrique. C'est le cas de la dire !
Merci.
Lo.
Mytå
Messages postés
2973
Date d'inscription
mardi 20 janvier 2009
Statut
Contributeur
Dernière intervention
20 décembre 2016
951
>
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
12 déc. 2014 à 16:23
12 déc. 2014 à 16:23
Re le Forum
Essaye comme ceci :
Mytå
Essaye comme ceci :
Sub Verif() Dim Formule_Verif As Long Dim N As Long, Der_Ligne As Long Formule_Verif = Rows(1).Find("Vérif", , , , xlByRows, xlPrevious).Column Der_Ligne = Columns(Formule_Verif).Offset(, -1).Find("*", , , , xlByColumns, xlPrevious).Row For N = Der_Ligne To 2 Step -1 Rows(N & ":" & N).Select With ActiveCell .FormulaR1C1 = "=IF(R[0]C[-2]=R[0]C[-1],""OK"",""!!!"")" If .Value = "OK" Then .Interior.ColorIndex = 4 ElseIf .Value = "!!!" Then .Interior.ColorIndex = 3 End If End With Next N End Sub
Mytå
via55
Messages postés
14512
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
18 janvier 2025
2 740
>
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
12 déc. 2014 à 16:57
12 déc. 2014 à 16:57
Bonjour
J'arrive trop tard Myrta t'as donné une solution
Tu pourrais aussi dans Der_Ligne = Columns(formule_verif).Find("*", , , , xlByColumns, xlPrevious).Row remplacer formule_verif par le n° d'une colonne dont tu es sûr qu'elle est remplie, par exemple si la colonne C est toujours remplie, donc la 3eme, ta ligne de code sera :
Der_Ligne = Columns(3).Find("*", , , , xlByColumns, xlPrevious).Row
Cdlmnt
J'arrive trop tard Myrta t'as donné une solution
Tu pourrais aussi dans Der_Ligne = Columns(formule_verif).Find("*", , , , xlByColumns, xlPrevious).Row remplacer formule_verif par le n° d'une colonne dont tu es sûr qu'elle est remplie, par exemple si la colonne C est toujours remplie, donc la 3eme, ta ligne de code sera :
Der_Ligne = Columns(3).Find("*", , , , xlByColumns, xlPrevious).Row
Cdlmnt
Mytå
Messages postés
2973
Date d'inscription
mardi 20 janvier 2009
Statut
Contributeur
Dernière intervention
20 décembre 2016
951
12 déc. 2014 à 17:23
12 déc. 2014 à 17:23
Re le Forum
Ou simplement :
Mytå
Ou simplement :
Der_Ligne = Columns(Formule_Verif - 1).Find("*", , , , xlByColumns, xlPrevious).Row
Mytå
17 sept. 2014 à 17:35
Je sais pas si c'est abuser (pour ma culture générale), pourrais-je savoir en langage courant ce que fait chaque ligne ?
Tu n'es pas obligé d'accepter ;-)
Merci encore