VBA : transfert de donnée selon "valeur"
eglantine217
Messages postés
54
Date d'inscription
Statut
Membre
Dernière intervention
-
f894009 Messages postés 17277 Date d'inscription Statut Membre Dernière intervention -
f894009 Messages postés 17277 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai un petit problème de code VBA et j'aurai besoin d'aide. Dans un tableau excel j'ai un ensemble de données avec en colonne G différentes valeurs (valeur1, valeur2, valeur3, valeur4). J'aurai aimé faire un seul et unique code qui selon la valeur de la colonne G copie et colle ces valeurs dans l'onglet correspondant exemple valeur1 en colonne G tout ira dans l'onglet 2 ; valeur2 en colonne G tout ira dans l'onglet 3 et ainsi de suite tout en respectant mon code ci-dessous. C'est vraiment compliqué mais je vous remercie d'avance !
J'ai un petit problème de code VBA et j'aurai besoin d'aide. Dans un tableau excel j'ai un ensemble de données avec en colonne G différentes valeurs (valeur1, valeur2, valeur3, valeur4). J'aurai aimé faire un seul et unique code qui selon la valeur de la colonne G copie et colle ces valeurs dans l'onglet correspondant exemple valeur1 en colonne G tout ira dans l'onglet 2 ; valeur2 en colonne G tout ira dans l'onglet 3 et ainsi de suite tout en respectant mon code ci-dessous. C'est vraiment compliqué mais je vous remercie d'avance !
Sub transfert_valeur1() Const nomFO = "DB_monthyear" 'nom de l'onglet de départ Const nomFD = "valeur1_data" 'nom de l'onglet d'arrivée Const CellD1 = "C12" 'cellule départ 1 Const CellD2 = "D12" 'cellule départ 2 Const CellD3 = "I12" 'cellule départ 3 Const CellD4 = "B12" 'cellule départ 4 Const CellD5 = "U12" 'cellule départ 5 Dim lifin As Long Dim lifin2 As Long Dim lifin3 As Long Dim lifin4 As Long Dim lifin5 As Long lifin = Range("F" & Rows.Count).End(xlUp).Row lifin2 = Range("A" & Rows.Count).End(xlUp).Row lifin3 = Range("H" & Rows.Count).End(xlUp).Row lifin4 = Range("T" & Rows.Count).End(xlUp).Row lifin5 = Range("AA" & Rows.Count).End(xlUp).Row Sheets(nomFO).Range("F7:F" & lifin).Copy Sheets(nomFD).Range(CellD1) Sheets(nomFO).Range("A7:E" & lifin2).Copy Sheets(nomFD).Range(CellD2) Sheets(nomFO).Range("H7:S" & lifin3).Copy Sheets(nomFD).Range(CellD3) Sheets(nomFO).Range("T7:T" & lifin4).Copy Sheets(nomFD).Range(CellD4) Sheets(nomFO).Range("U7:AA" & lifin5).Copy Sheets(nomFD).Range(CellD5) End Sub
A voir également:
- VBA : transfert de donnée selon "valeur"
- Excel compter cellule couleur sans vba - Guide
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
- Mkdir vba ✓ - Forum VB / VBA
- Dépassement de capacité vba ✓ - Forum Excel
3 réponses
Bonjour,
Si j'ai bien compris, vous voulez nomer les feuilles selon les valuers ds le col G. Donc le code est comme suivante:
Je l'ai essayé.,Ca doit marcher. Si vous voulez je peux vous l'envoyer la feuille avec le code.
Cord,Alena
Si j'ai bien compris, vous voulez nomer les feuilles selon les valuers ds le col G. Donc le code est comme suivante:
Sub ValeurSheet() Dim ssheetname As String Dim n As Long, lastrow As Long Dim ssheet1 As Worksheet Set ssheet1 = Sheets("DB_monthyear") 'search last row in the col G lastrow = ssheet1.Cells.Find(What:="*", After:=[G1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 'start the boucle of the values in the col G For i = 1 To lastrow 'remember the name of the value in col G ssheetname = ssheet1.Cells(i, 7) 'n=calculates number of sheets with name=ssheetname.In the beginning of the boucle of the sheets reset the value of n n = 0 For Each Worksheet In Worksheets If Worksheet.Name = ssheetname Then n = n + 1 End If Next Worksheet If n < 1 Then Sheets.Add.Move After:=Sheets(Sheets.Count) ActiveSheet.Name = ssheetname End If Next i End Sub
Je l'ai essayé.,Ca doit marcher. Si vous voulez je peux vous l'envoyer la feuille avec le code.
Cord,Alena
non c'est pas ça mais votre réponse correspond à une autre question que je me pose ! merci pour le code
moi je veux actuellement éviter de filtrer la colonne sur valeur1 puis de coller dans l'onglet V1 je voudrai que le copier coller soit automatiquement c'est à dire la ligne est copié puis collé dans l'onglet correspondant V1 si en G j'ai la valeur ("valeur1) etc ... je suis perdue totalement
moi je veux actuellement éviter de filtrer la colonne sur valeur1 puis de coller dans l'onglet V1 je voudrai que le copier coller soit automatiquement c'est à dire la ligne est copié puis collé dans l'onglet correspondant V1 si en G j'ai la valeur ("valeur1) etc ... je suis perdue totalement
Rebonjour,
Ok supposons que les feuilles correspondants aux valuers deja existent et que vous voulez copier la valeureX dans le feuille nomé valeureX que une fois a partir de feuille DB_monthyear. J'espere que j'ai bien compris votre demnade cette fois. La valeure sera copier dans la cellule(1,1), mais vous pouvez modifier cette cellule Donc le code est comme suivante;
Cord, Alena
Ok supposons que les feuilles correspondants aux valuers deja existent et que vous voulez copier la valeureX dans le feuille nomé valeureX que une fois a partir de feuille DB_monthyear. J'espere que j'ai bien compris votre demnade cette fois. La valeure sera copier dans la cellule(1,1), mais vous pouvez modifier cette cellule Donc le code est comme suivante;
Sub ValeurInSheet() Dim ssheetname As String, cel As Range Dim lastrow As Long Dim ssheet1 As Worksheet Set ssheet1 = Sheets("DB_monthyear") 'search last row in the col G lastrow = ssheet1.Cells.Find(What:="*", After:=[G1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 'start the boucle of the values in the col G For i = 1 To lastrow 'remember the name of the value in col G ssheetname = ssheet1.Cells(i, 7) For Each Worksheet In Worksheets If Worksheet.Name = ssheetname Then 'compares value in col G with the name of excel sheet Worksheet.Activate Set cel = ActiveSheet.Cells.Columns(1).Find(What:=ssheetname) 'checks whether there is already valueX in sheet valueX If cel Is Nothing Then 'if there is no yet valueX copies in sheet valueX, then it will copy it Cells(1, 1) = ssheetname End If End If Next Worksheet Next i End Sub
Cord, Alena
Re,
Si j'ai compris ce que vous voulez, un exemple de code.
A+
Si j'ai compris ce que vous voulez, un exemple de code.
Sub copier_coller() Dim cel As Range, Plage As Range With Worksheets("DB_monthyear") 'derniere ligne Datas derlig = .Cells.Find("*", , , , xlByRows, xlPrevious).Row 'Definition plage de recherche Set Plage = .Range("G7:G" & derlig) For Each cel In Plage Valeur = cel.Text 'derniere ligne Onglet Vx DLC = Worksheets(Valeur).Range("C" & Rows.Count).End(xlUp).Row + 1 If DLC < 12 Then DLC = 12 DLD = Worksheets(Valeur).Range("D" & Rows.Count).End(xlUp).Row + 1 If DLD < 12 Then DLD = 12 DLI = Worksheets(Valeur).Range("I" & Rows.Count).End(xlUp).Row + 1 If DLI < 12 Then DLI = 12 DLB = Worksheets(Valeur).Range("B" & Rows.Count).End(xlUp).Row + 1 If DLB < 12 Then DLB = 12 DLU = Worksheets(Valeur).Range("U" & Rows.Count).End(xlUp).Row + 1 If DLU < 12 Then DLU = 12 'copie des cellules If .Cells(cel.Row, "F") <> "" Then .Cells(cel.Row, "F").Copy Worksheets(Valeur).Range("C" & DLC) End If If .Cells(cel.Row, "A") <> "" Then .Cells(cel.Row, "A").Copy Worksheets(Valeur).Range("D" & DLD) End If If .Cells(cel.Row, "H") <> "" Then .Cells(cel.Row, "H").Copy Worksheets(Valeur).Range("I" & DLI) End If If .Cells(cel.Row, "T") <> "" Then .Cells(cel.Row, "T").Copy Worksheets(Valeur).Range("B" & DLB) End If If .Cells(cel.Row, "U") <> "" Then .Cells(cel.Row, "U").Copy Worksheets(Valeur).Range("U" & DLU) End If Next cel End With End Sub
A+
si dans la colonne G on a valeur2 alors toute la ligne est copié vers l'onglet valeur2
tout en respectant mon code avec le transfert vers les cellules indiquées
pour le moment j'ai fait 5 boutons et je suis obligé de filtrer sur la colonne G puis de cliquer sur le bon bouton
c'est vraiment compliqué ...
Vous voulez dire:
Chaque fois que dans la colonne G il y a les V1 a V4, il faut copier la ligne dans l'onglet qui a pour nom valeur1 pour V1 et ainsi de suite?
j'aimerai que le copier coller se fasse directement si c'est V1 alors la ligne part dans l'onglet V1 etc ...