Liste déroulante et macro
Bonjour,
Je me permets d'écrire une question sur le forum car j'aurais besoin d'aide pour mettre en place une liste déroulante type formulaire ou active X) sur excel.
Je vous explique mon problème:
j'ai un onglet "données" dans lequel j'ai des informations saisies manuellement (client, mois, code article, ventes...) et je souhaiterais que sur un autre onglet "visuel" je puisse récupérer des données de mon onglet base de données à l'aide d'une liste déroulante basée sur mes clients.
Je souhaiterais par exemple, sélectionner dans ma liste déroulante le client A et voir apparaitre les ventes, articles, mois de ce client de façon automatique.
J'ai joint un fichier excel au cas où mon explication n'est pas clair.
Je vous remercie d'avancer pour votre aide et sympathie,
Cordialement,
Bonjour,
A ta place ... je plonge direct sur un TCD ... en 2 secondes tout est fait ...
Ci-joint ton fichier ...
Merci pour votre réponse James007, mais j'en avais déjà fait et le nombre important de lignes et colonnes le rend peu lisible.
C'est pour cela que je souhaiterais utiliser une liste déroulante pour mettre en forme mes données comme je le souhaite.
Bonjour,
Réaménagement de Visuel : liste déroulante Client en A2.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cli$, a%
If Target.Address = "$A$2" Then
If Target <> "" Then
cli = Target: a = Target.Cells(1, 2)
Recherche cli, a
Else
a = Me.Range("B3").CurrentRegion.Rows.Count - 3
Me.Range("B4").Resize(a, 10).ClearContents
End If
End If
End Sub
Procédure dans le module de la feuille Visuel. Se déclenche lors d'un changement en A2.
Si un client sélectionné, lance la proc. Recherche.
Sub Recherche(cli As String, a As Integer)
Dim dA1(), dA2(), v1%, v2%, n%, i%, j%, col
col = Array(3, 4, 5, 14, 22)
With Worksheets("données")
n = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 2 To n
If .Cells(i, 2) = cli Then
If .Cells(i, 1) = a Then
ReDim Preserve dA1(4, v1)
For j = 0 To 4
dA1(j, v1) = .Cells(i, col(j))
Next j
v1 = v1 + 1
ElseIf .Cells(i, 1) = a + 1 Then
ReDim Preserve dA2(4, v2)
For j = 0 To 4
dA2(j, v2) = .Cells(i, col(j))
Next j
v2 = v2 + 1
End If
End If
Next i
End With
Application.ScreenUpdating = False
With Worksheets("Visuel")
n = .Range("B3").CurrentRegion.Rows.Count - 3
.Range("B4").Resize(n, 10).ClearContents
If v1 > 0 Then .Range("B4").Resize(v1, 5).Value = WorksheetFunction.Transpose(dA1)
If v2 > 0 Then .Range("G4").Resize(v2, 5).Value = WorksheetFunction.Transpose(dA2)
End With
End Sub
NB- Dans la mesure où l'on poursuivra d'année en année (2017 et 2018 remplaçant 2016 et 2017, etc.) il conviendrait d'asservir la 2e année à la 1re avec une formule : =B2+1
Eventuellement mettre la première année sous liste déroulante... et si l'on pouvoir faire des retours dans le temps inclure le changement en B2 pour déclencher la procédure (tenir compte qu'il s'agit d'une cellule fusionnée).
Cordialement.
Merci MFerrand pour votre réponse, mais lorsque je sélectionne un client, j'ai un blocage au niveau :
.Range("B4").Resize(n, 10).ClearContents
j'ai modifié le "n" par "a" et ça a l'air de fonctionner.
Merci beaucoup pour votre aide et votre temps.
Cordialement,
La proc. Change utilise la variable a (qui alors ne sert pas à recueillir l'année).
Mais la proc. Recherche utilise n pour cette action, n étant initialisée pour cela juste à la ligne précédente.
Omission de ma part !
Modifie la ligne comme suit :
If n > 0 Then .Range("B4").Resize(n, 10).ClearContents
Cordialement.
Oui merci cela fonctionne.
Si je souhaite ajouter une colonne dans l'onglet "visuel", par exemple la colonne 16 de l'onglet "données" pour 2016 et 2017.
Pouvez-vous me dire ce que je dois faire? J'ai bien essayé de rajouter le numéro de colonne dans col=array(3,4,5,14,16,22) mais rien.
Merci.
Cordialement,
Tu rajustes tous les autres éléments de la macro ! Tout est à redimensionner !
Bonjour,
Je ne maitrise pas vraiment VBA, j'arrive à décaler une colonne mais je n'arrive pas à lui demander de copier une colonne.
Pouvez-vous s'il vous plait m'expliquer le code utilisé?
Merci.
Cordialement,
Bonjour,
Reprenons les procédures... Une colonne de plus en Visuel pour chaque année : le tableau ira de B à M (au lieu de K), 12 colonnes au lieu de 10...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cli$, a%
If Target.Address = "$A$2" Then
If Target <> "" Then
cli = Target: a = Target.Cells(1, 2)
Recherche cli, a
Else
a = Me.Range("B3").CurrentRegion.Rows.Count - 3
Me.Range("B4").Resize(a, 12).ClearContents
End If
End If
End Sub
Sur la proc. Change, elle lance Recherche (donc c'est dans Recherche que ça va se passer) si un client est à chercher. Sinon elle efface, le dimensionnement de la zone effacée passe de 10 à 12 colonnes : la seule modification à opérer est donc le 10 (colonnes) par 12 dans le dimensionnement de la plage...
Sub Recherche(cli As String, a As Integer)
Dim dA1(), dA2(), v1%, v2%, n%, i%, j%, col
col = Array(3, 4, 5, 14, 16, 22)
With Worksheets("données")
n = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 2 To n
If .Cells(i, 2) = cli Then
If .Cells(i, 1) = a Then
ReDim Preserve dA1(5, v1)
For j = 0 To 5
dA1(j, v1) = .Cells(i, col(j))
Next j
v1 = v1 + 1
ElseIf .Cells(i, 1) = a + 1 Then
ReDim Preserve dA2(5, v2)
For j = 0 To 5
dA2(j, v2) = .Cells(i, col(j))
Next j
v2 = v2 + 1
End If
End If
Next i
End With
Application.ScreenUpdating = False
With Worksheets("Visuel")
n = .Range("B3").CurrentRegion.Rows.Count - 3
If n > 0 Then .Range("B4").Resize(n, 12).ClearContents
If v1 > 0 Then .Range("B4").Resize(v1, 6).Value = WorksheetFunction.Transpose(dA1)
If v2 > 0 Then .Range("G4").Resize(v2, 6).Value = WorksheetFunction.Transpose(dA2)
End With
End Sub
Colonne ajoutée : on l'intègre comme tu l'as fait dans le tableau des numéros de colonnes, qui passe de 5 à 6 valeurs (indices 0 à 5).
Les tableaux dA1 et dA2 recueillant les résultats pour chacune des années doivent être dimensionnés en conséquence : leur première dimension (correspondant aux colonnes) passe donc de 4 à 5. Et la boucle j de 0 à 4 pour servir ces tableaux passe également de 0 à 5.
Redimensionnement de 10 à 12 pour l'effacement (comme précédemment pour Change). Et redimensionnement de 5 à 6 colonnes pour chacune des années, lors de l'affectation.
C'est tout ce qui a bougé semble-t-il !
NB- Désolé pour la fausse manoeuvre qui a lâché le post incomplet...
Cordialement.
Bonjour, MFerrand,
Sincèrement, merci pour votre aide, cela fonctionne très bien. J'ai également modifié la colonne (g4 pour h4).
Est-il possible d'afficher les blocs (b:g) et (h:m) par ordre chronologique via le mois?
Merci.
Cordialement,
G —› H ! J'avais zappé ce décalage ! je dois commencer à fatiguer !
On peut trier les tableaux... Mais demain (après que j'aurais fait rétablir l'eau !
A+
c'est qu 'un petit détail mais si la voisine prend sa douche dans son salon...