VBA: transfert de données entre colonnes
Elmo
-
Elmo -
Elmo -
Bonjour à tous,
Débutant en VBA, je cherche à faire une macro qui, en fonction des données d'une colonne, extrait les données d'une autre colonne dans une 3ème...
Exemple:
A B
0 2000
G 3400
G 3700
H 200
H 1500
H 1300
G 1400
Je voudrais faire apparaitre en colonne C, pour chaque "groupement" H ou G, le maximum de B de celui-ci (ex: le max pour A2:A3 est 3700 (en B). Je voudrais que 3700 apparaisse en C2 et C3. Le max de A4:A6 est 1500. Je voudrais que 1500 apparaisse en C4:C6)
J'ai commencé à faire un code tout seul à partir de ce que j'ai pu trouver à droite à gauche, mais j'imagine que ça doit pas être glorieux:
Sub Test1()
Dim i, j As Integer
i = 2
For j = 1 To 10 'beaucoup plus de lignes en réalité...
While Range("F" & i).Value = Range("F" & i - 1).Value
i = i + 1
Wend
Range("J&i:J&j").Value = Application.WorksheetFunction.Max(Range("I&i:I&j").Value)
Next j
End Sub
Merci de vos réponses!
Débutant en VBA, je cherche à faire une macro qui, en fonction des données d'une colonne, extrait les données d'une autre colonne dans une 3ème...
Exemple:
A B
0 2000
G 3400
G 3700
H 200
H 1500
H 1300
G 1400
Je voudrais faire apparaitre en colonne C, pour chaque "groupement" H ou G, le maximum de B de celui-ci (ex: le max pour A2:A3 est 3700 (en B). Je voudrais que 3700 apparaisse en C2 et C3. Le max de A4:A6 est 1500. Je voudrais que 1500 apparaisse en C4:C6)
J'ai commencé à faire un code tout seul à partir de ce que j'ai pu trouver à droite à gauche, mais j'imagine que ça doit pas être glorieux:
Sub Test1()
Dim i, j As Integer
i = 2
For j = 1 To 10 'beaucoup plus de lignes en réalité...
While Range("F" & i).Value = Range("F" & i - 1).Value
i = i + 1
Wend
Range("J&i:J&j").Value = Application.WorksheetFunction.Max(Range("I&i:I&j").Value)
Next j
End Sub
Merci de vos réponses!
A voir également:
- VBA: transfert de données entre colonnes
- 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
4 réponses
Bonsoir,
J'ai mis vos données colonne 1 et 2 à partir de la ligne 1
Je vous ai fait un truc vite fait, je suis parti du principe que le nombre de critères n'est pas connu (O G H et d'autres)
Sub Macro1()
Dim Tableau_Critère() As String
Dim Tableau_Critère2() As String
Dim X As Integer
Dim Y As Integer
Dim Z As Integer
X = 1
' chargement de tous les critères dans un tableau Tableau_Critère
While Cells(X, 1) <> ""
ReDim Preserve Tableau_Critère(X) As String
Tableau_Critère(X) = Cells(X, 1)
X = X + 1
Wend
ReDim Preserve Tableau_Critère2(1) As String
Tableau_Critère2(1) = Tableau_Critère(1)
' récupération dans un tableau des différents critères Tableau_Critère2
For Y = 1 To UBound(Tableau_Critère)
existe = 0
For Z = 1 To UBound(Tableau_Critère2)
If Tableau_Critère(Y) = Tableau_Critère2(Z) Then
existe = 1
Exit For
End If
Next Z
If existe = 0 Then
ReDim Preserve Tableau_Critère2(UBound(Tableau_Critère2) + 1) As String
Tableau_Critère2(UBound(Tableau_Critère2)) = Tableau_Critère(Y)
End If
Next Y
' recherche du max pour chaque critère
For X = 1 To UBound(Tableau_Critère2)
Max = 0
Y = 1
While Cells(Y, 1) <> ""
If Cells(Y, 1) = Tableau_Critère2(X) Then
If Cells(Y, 2) > Max Then Max = Cells(Y, 2)
End If
Y = Y + 1
Wend
' ecriture sur la feuille
Cells(X, 3) = Tableau_Critère2(X)
Cells(X, 4) = Max
Next X
End Sub
Comme toujours en programmation il y a plusieurs façons de voir
en voilà une
Bonne programmation
J'ai mis vos données colonne 1 et 2 à partir de la ligne 1
Je vous ai fait un truc vite fait, je suis parti du principe que le nombre de critères n'est pas connu (O G H et d'autres)
Sub Macro1()
Dim Tableau_Critère() As String
Dim Tableau_Critère2() As String
Dim X As Integer
Dim Y As Integer
Dim Z As Integer
X = 1
' chargement de tous les critères dans un tableau Tableau_Critère
While Cells(X, 1) <> ""
ReDim Preserve Tableau_Critère(X) As String
Tableau_Critère(X) = Cells(X, 1)
X = X + 1
Wend
ReDim Preserve Tableau_Critère2(1) As String
Tableau_Critère2(1) = Tableau_Critère(1)
' récupération dans un tableau des différents critères Tableau_Critère2
For Y = 1 To UBound(Tableau_Critère)
existe = 0
For Z = 1 To UBound(Tableau_Critère2)
If Tableau_Critère(Y) = Tableau_Critère2(Z) Then
existe = 1
Exit For
End If
Next Z
If existe = 0 Then
ReDim Preserve Tableau_Critère2(UBound(Tableau_Critère2) + 1) As String
Tableau_Critère2(UBound(Tableau_Critère2)) = Tableau_Critère(Y)
End If
Next Y
' recherche du max pour chaque critère
For X = 1 To UBound(Tableau_Critère2)
Max = 0
Y = 1
While Cells(Y, 1) <> ""
If Cells(Y, 1) = Tableau_Critère2(X) Then
If Cells(Y, 2) > Max Then Max = Cells(Y, 2)
End If
Y = Y + 1
Wend
' ecriture sur la feuille
Cells(X, 3) = Tableau_Critère2(X)
Cells(X, 4) = Max
Next X
End Sub
Comme toujours en programmation il y a plusieurs façons de voir
en voilà une
Bonne programmation
Bonjour,
Tout d'abord, merci pour votre réponse, même si je n'ai pas tout compris!
En fait, l'objectif ici n'est pas de déterminer le max pour chaque critère mais par "groupement de critère" et par ligne.
Je m'explique: si en ligne 2 et 3 on a H et H, je voudrait qu'en colonne C s'affiche, pour les lignes 2 et 3, le maximum de ces 2 lignes.
Pour reprendre mon 1er exemple, le résultat serait ceci:
0 2000 2000
G 3400 3700
G 3700 3700
H 200 1500
H 1500 1500
H 1300 1500
G 1400 1400
Plus précisément, il n'y a que 2 critères, H et G. Pour les 0, il n'y a rien à faire, juste recopier la valeur de la colonne B en C.
Pour placer le contexte: j'ai un fichier client. J'ai regroupé certains clients en fonction de leurs appartenance à un groupe plus grand. H et G sont là pour dire "ce client appartient au même groupe que les H (ou G) adjacents. Les "0" sont des clients qui n'appartiennent pas à un groupe particulier
Encore merci.
Tout d'abord, merci pour votre réponse, même si je n'ai pas tout compris!
En fait, l'objectif ici n'est pas de déterminer le max pour chaque critère mais par "groupement de critère" et par ligne.
Je m'explique: si en ligne 2 et 3 on a H et H, je voudrait qu'en colonne C s'affiche, pour les lignes 2 et 3, le maximum de ces 2 lignes.
Pour reprendre mon 1er exemple, le résultat serait ceci:
0 2000 2000
G 3400 3700
G 3700 3700
H 200 1500
H 1500 1500
H 1300 1500
G 1400 1400
Plus précisément, il n'y a que 2 critères, H et G. Pour les 0, il n'y a rien à faire, juste recopier la valeur de la colonne B en C.
Pour placer le contexte: j'ai un fichier client. J'ai regroupé certains clients en fonction de leurs appartenance à un groupe plus grand. H et G sont là pour dire "ce client appartient au même groupe que les H (ou G) adjacents. Les "0" sont des clients qui n'appartiennent pas à un groupe particulier
Encore merci.
Bonjour,
Au vu du petit tableau ceci doit s'approcher
J'ai fait débuter mon tableau en A2
Vous pouvez tout copier à partir du Sub Macro1() les explications à l'intérieur
sont en commentaire
Sub Macro1()
X = 2 ' mettre le numéro de ligne où débute votre tableau
Max = 0 ' Variable qui contient le Max
Debut_Groupe = X 'debut de la zone pour un critère
While Cells(X, 1) <> ""
If Cells(X, 2) > Max Then
Max = Cells(X, 2) ' recup du max pour un groupement
End If
If Cells(X + 1, 1) <> Cells(X, 1) Then
For Y = Debut_Groupe To X
Cells(Y, 3) = Max ' remplissage en colonne 3 du max pour un groupement
Next Y
Max = 0
Debut_Groupe = X + 1
End If
X = X + 1
Wend
End Sub
Bonne continuation
Au vu du petit tableau ceci doit s'approcher
J'ai fait débuter mon tableau en A2
Vous pouvez tout copier à partir du Sub Macro1() les explications à l'intérieur
sont en commentaire
Sub Macro1()
X = 2 ' mettre le numéro de ligne où débute votre tableau
Max = 0 ' Variable qui contient le Max
Debut_Groupe = X 'debut de la zone pour un critère
While Cells(X, 1) <> ""
If Cells(X, 2) > Max Then
Max = Cells(X, 2) ' recup du max pour un groupement
End If
If Cells(X + 1, 1) <> Cells(X, 1) Then
For Y = Debut_Groupe To X
Cells(Y, 3) = Max ' remplissage en colonne 3 du max pour un groupement
Next Y
Max = 0
Debut_Groupe = X + 1
End If
X = X + 1
Wend
End Sub
Bonne continuation