[Résolu]VBA: questions sur la définition de champs à partir d'un autre colonne pleine

stephsteph

XLDnaute Occasionnel
Bonjour,

J'ai à nouveau 2 questions (faciles) qui dépassent ma compétence en macro VBA.

C'est pour une macro dont j'ai réalisé la plus grosse part avec le programme automatique.

1- je veux copier le contenu d'une colonne entre la ligne 13 et la ligne x, sachant que x varie au cours du temps (des lignes sont ajoutées à différents endroits);
je ne peux pas le faire avec la macro automatique (sélection début, fin descente) car dans ma colonne j'ai des lignes vierges;
je pourrai le faire avec une autre colonne qui, elle, est avec des lignes constamment remplies (ici colonne 5);
l'idée serait donc d'utiliser ma colonne remplie pour capter la valeur de x, puis de demander à copier la colonne ciblée entre 13 et la valeur de x captée.

2- je veux, dans un autre fichier, créer un champ/plage (un peu plus loin dans la macro) qui se définit comme plusieurs colonnes conjointes et entre la ligne 1 (pas 13) et la ligne y, sachant que comme précédemment dans ma colonne ciblée j'ai des lignes vierges;
je pourrai le faire avec une autre colonne qui, elle, est avec des lignes constamment remplies (ici la colonne 1) et je trierai ce champ/plage sur une autre colonne (ici colonne 2 qui est issue de la conversion de la colonne 11 du 1er fichier).


Pour faciliter la compréhension, j'attache 2 fichiers xlsm théoriques pour que la démarche puisse servir à d'autres sur ce forum, debut (données de base) et fin (données copiées, macro test2, création du champ/plage test).


Merci de votre coup de pousse,

Steph
 

Pièces jointes

  • debut.xlsm
    9.2 KB · Affichages: 57
  • fin.xlsm
    13.3 KB · Affichages: 45
  • debut.xlsm
    9.2 KB · Affichages: 52
  • debut.xlsm
    9.2 KB · Affichages: 62
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA : questions sur la définition de champs à partir d'un autre colonne pleine

Bonjour Steph, bonjour le forum,

Peut-être comme ça si les deux classeurs sont ouverts (nom des classeurs et des onglets à adapter éventuellement) :
Code:
Option Explicit

Sub test2()
Dim d As Workbook 'déclare la variable d (classeur Début)
Dim f As Workbook 'déclare la variable f (classeur Fin)
Dim od As Object 'déclare la variable od (Onglet Début)
Dim of As Object 'déclare la variable of (Onglet Fin)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim cel As Range 'déclare la variable cel (CELlule)

Set d = Workbooks("debut.xlsm") 'définit le classeur début (à adapter à ton cas)
Set f = Workbooks("fin.xlsm") 'définit le classeur fin (à adapter à ton cas)
Set od = d.Sheets("Feuil1") 'définit l'onglet début (à adapter à ton cas)
Set of = f.Sheets("feuil1") 'définit l'onglet fin (à adapter à ton cas)
dl = od.Cells(Application.Rows.Count, 5).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 5 (=E) de l'onglet "Feuil1" du classeur "debut.xlsm"
od.Range("E13:E" & dl).Copy f.Sheets("Feuil1").Range("A1") 'copie les données de la colonne E et les colle dans A1 du classeur "fin.xlsm"
od.Range("K13:K" & dl).Copy of.Range("B1") 'copie les données de la colonne K et les colle dans B1 du classeur "fin.xlsm"
For Each cel In of.Range("B1:B" & dl - 12) 'boucle sur toutes les cellules cel de la colonne B de l'onglet "Feuil1" du classeur "fin.xlsm"
    If cel.Value <> "" Then 'condition : si la cellule n'est pas vide
        cel.Offset(0, 1).Value = Split(cel.Value, "|")(1) 'récupère le texte après la bare (|) dans la colonne C
        cel.Value = Split(cel.Value, "|")(0) 'récupère le texte avant la barre (|) dans la colonne B
    End If 'fin de la condition
Next cel 'prochaine cellule de la boucle
of.Range("A1").CurrentRegion.Name = "test" 'nomme la plage
End Sub
 

stephsteph

XLDnaute Occasionnel
Re : VBA : questions sur la définition de champs à partir d'un autre colonne pleine

Bonjour Robert, bonjour le forum

Merci beaucoup.
J'ai adapté et çà marche bien (et les explications sont très claires).
J'ai juste 2 - 3 bricoles.
1- dans od.Range("E13, etc), en fait dans ma macro automatique je copie valeur, que dois-je ajouter dans ton code pour cela?
2- ta macro passe par une boucle et je ne vois rien avec le fonctionnement pas à pas (avec F8), peux-tu m'expliquer le principe et le déroulé pour que j'apprenne à l'adapter à d'autres cas similaires?
3- en fait le champ est à créer après tri (ton code se termine par la création de 'test', je veux trier ce 'test' nommé ou pas, sur colonne B -cad le texte avant la barre- dans l'ordre Z-A -cad décroissant-, puis sur colonne A dans l'ordre A-Z, et quand le tri est fait c'est là que je nomme le champ jusqu'à la dernière ligne remplie comprise de la colonne B (le reste ne m'intéresse pas, la colonne A est bien plus longue)

Bon voilà j'espère que je suis claire.
Le seul os c'est le point 1 (j'ai essayé en ajoutant .value à ton code, mais cela ne marche pas), le 3ème je peux toujours ajouter du code avec la macro automatique et finir manuellement (mais cela ne sera pas élégant)

A+

Steph
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA : questions sur la définition de champs à partir d'un autre colonne pleine

Bonjour Steph, bonjour le forum,

1- dans od.Range("E13, etc), en fait dans ma macro automatique je copie valeur, que dois-je ajouter dans ton code pour cela?
Code:
od.Range("E13:E" & dl).Copy
of.Range("A1").PasteSpecial (xlPasteValues) 'copie les données de la colonne E et les colle dans A1 du classeur "fin.xlsm"
od.Range("K13:K" & dl).Copy
of.Range("B1").PasteSpecial (xlPasteValues) 'copie les données de la colonne K et les colle dans B1 du classeur "fin.xlsm"

2- ta macro passe par une boucle et je ne vois rien avec le fonctionnement pas à pas (avec F8), peux-tu m'expliquer le principe et le déroulé pour que j'apprenne à l'adapter à d'autres cas similaires?
La fonction split renvoie un tableau de (0 à x) contenant les occurrences entre le délimiteur : Split(texte, delimiteur)(x).
Split("16|donneesspec, "|")(0), renvoie 16
Split("16|donneesspec, "|")(1), renvoie donneesspec. La boucle me permet donc de scinder la colonne B en deux colonnes B et C. Pour voir ça pas à pas il faut que l'onglet actif soit of. Autrement dit il faut que le classeur actif soit fin.xlsm...

oulé pour que j'apprenne à l'adapter à d'autres cas similaires?
3- en fait le champ est à créer après tri (ton code se termine par la création de 'test', je veux trier ce 'test' nommé ou pas, sur colonne B -cad le texte avant la barre- dans l'ordre Z-A -cad décroissant-, puis sur colonne A dans l'ordre A-Z, et quand le tri est fait c'est là que je nomme le champ jusqu'à la dernière ligne remplie comprise de la colonne B (le reste ne m'intéresse pas, la colonne A est bien plus longue)
Code:
f.Activate
of.Activate
of.Sort.SortFields.Clear
of.Sort.SortFields.Add Key:=Range("B1:B30") _
    , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
of.Sort.SortFields.Add Key:=Range("A1:A30") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With of.Sort
    .SetRange Range("A1").CurrentRegion
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

Le cod complet :
Code:
Option Explicit

Sub test2()
Dim d As Workbook 'déclare la variable d (classeur Début)
Dim f As Workbook 'déclare la variable f (classeur Fin)
Dim od As Object 'déclare la variable od (Onglet Début)
Dim of As Object 'déclare la variable of (Onglet Fin)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim cel As Range 'déclare la variable cel (CELlule)

Set d = Workbooks("debut.xlsm") 'définit le classeur début (à adapter à ton cas)
Set f = Workbooks("fin.xlsm") 'définit le classeur fin (à adapter à ton cas)
Set od = d.Sheets("Feuil1") 'définit l'onglet début (à adapter à ton cas)
Set of = f.Sheets("feuil1") 'définit l'onglet fin (à adapter à ton cas)
dl = od.Cells(Application.Rows.Count, 5).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 5 (=E) de l'onglet "Feuil1" du classeur "debut.xlsm"
od.Range("E13:E" & dl).Copy
of.Range("A1").PasteSpecial (xlPasteValues) 'copie les données de la colonne E et les colle dans A1 du classeur "fin.xlsm"
od.Range("K13:K" & dl).Copy
of.Range("B1").PasteSpecial (xlPasteValues) 'copie les données de la colonne K et les colle dans B1 du classeur "fin.xlsm"
For Each cel In of.Range("B1:B" & dl - 12) 'boucle sur toutes les cellules cel de la colonne B de l'onglet "Feuil1" du classeur "fin.xlsm"
    If cel.Value <> "" Then 'condition : si la cellule n'est pas vide
        cel.Offset(0, 1).Value = Split(cel.Value, "|")(1) 'récupère le texte après la bare (|) dans la colonne C
        cel.Value = Split(cel.Value, "|")(0) 'récupère le texte avant la barre (|) dans la colonne B
    End If 'fin de la condition
Next cel 'prochaine cellule de la boucle
Application.CutCopyMode = False 'masque le clignotement des cellules copiées

'***
'tri
'***
f.Activate
of.Activate
of.Sort.SortFields.Clear
of.Sort.SortFields.Add Key:=Range("B1:B30") _
    , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
of.Sort.SortFields.Add Key:=Range("A1:A30") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With of.Sort
    .SetRange Range("A1").CurrentRegion
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
'*******
'fin tri
'*******

of.Range("A1:C" & of.Cells(Application.Rows.Count, 2).End(xlUp).Row).Name = "test" 'nomme la plage
End Sub
 

stephsteph

XLDnaute Occasionnel
Re : VBA : questions sur la définition de champs à partir d'un autre colonne pleine

Bonjour Robert, bonjour le forum,

Cela marche nickel!
Bravos et merci beaucoup.
C'est vraiment une macro très pratique et didactique.
J'ai aussi pu faire fonctionner le pas à pas et compris ta boucle avec split.

Bonne soirée à toi que je souhaite (à Sète) aussi ensoleillée qu'à Paris (c'est rare)!
Steph
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : [Résolu]VBA: questions sur la définition de champs à partir d'un autre colonne p

Bonjour Steph, bonjour le forum,

Bah... Pour une fois c'est vous qui avez le soleil. On va pas se plaindre... Profitez-en mais rendez-le nous en bon état hein !
 

Discussions similaires

Réponses
6
Affichages
132
Réponses
2
Affichages
148
Réponses
15
Affichages
763
Compte Supprimé 979
C
Réponses
7
Affichages
349

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin