Déplacer colonnes en fonction valeur cellule [Résolu/Fermé]

Signaler
-
 kiju9634 -
Bonjour,

Je cherche à créer un programme qui permettrait de déplacer les valeurs de plusieurs colonnes en fonction de la valeur d'une cellule (choix produit). Par exemple dans le fichier ci-joint (j'aimerais joindre un fichier excel mais je ne sais pas comment faire??) je voudrais copier les valeurs arrêt,machine,x dans la Feuil2 les unes en dessous des autres et en ne prenant pas les blancs en compte. J'aimerais qu'elles apparaissent lorsque l'on sélectionne dans la liste. Par exemple je selectionne Milka sur feuille 2 et la ça copie les valeurs des colonnes de Milka de la feuille 1 les unes en dessous des autres.

J'ai essayer le code suivant:
(Mais ça ne fonctionne pas)

Sub Renouvellement ()
Dim plage As Range, cel As Range

Application.ScreenUpdating = False
valcherch = "milka"
With Worksheets("Feuil1")
dercol = Worksheets("Feuil1").Range("B13:B23")
Set plage = .Range("J12:B12" & dercol)
End With

For Each cel In plage
If cel = valcherch Then
cel.EntireColumn.Copy
Worksheets("Feuil2").Range("B9:B17").Select
Selection.Insert Shift:=xlDown
End If
Next cel
Application.ScreenUpdating = True
End Sub


Merci par avance pour votre aide

6 réponses

Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
530
Bonsoir,

Pour joindre un fichier : https://www.cjoint.com/

Quelques remarques sur ton code :

1- "cel" n'est pas une variable "range" mais une variable objet
Dim plage As Range, cel As Object

2- la définition de ta plage est incohérente.
 
Bonjour,
Merci de votre réponse.
Pourquoi ma plage est-elle incohérente ? Je débute en VBA j'ai un peu de mal à comprendre le fonctionnement de certaines instructions. Pourriez-vous m'expliquer svp ?

Le fichier est le suivant:
http://www.cjoint.com/c/FFrfTLXQBrv/


Il est en PDF car l'excel etait trop volumineux.
Merci !
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
530
Bonjour,

Cette instruction ne fonctionne pas
Set plage = .Range("J12:B12" & dercol)
De plus, on ne comprend pas quelle plage vous cherchez à définir

La feuille ci-jointe correspond apparemment à la feuille résultat (feuil2 dans votre demande). Pouvez-vous communiquer un exemple de la feuille source (feuil1 dans votre demande).
 
Je vous ai repondu en commentant ci-dessous. En effet sur le pdf joint il n'y a que la feuille 1...
Je joint la feuille 2 des que je le peux. J'ai essayé d'expliquer mon besoin ci jamais j'espère que cela est plus claire... Merci.
Bonjour,
en fait, ce que je souhaiterais c'est que l'ordinateur parcours la ligne B12aJ12 de la feuille 1 et que lorsqu'il trouve Milka il copie colle les valeurs de la colonne en dessous dans la feuille 2 à l'emplacement Milka puis qu'il continue et que si il retombe sur un Milka il fasse pareil en copie collant les valeurs en dessous des précédentes dans la feuille2. Du coup je pensais qu'en utilisant l'instruction plage ca permettait de parcourir la plage citée ci-dessus.
Je ne suis pas Sure Que j'ai fait comme il faut (apparement non vu que ca ne fonctionne pas.. Je débute alors je ne sais pas trop comment faire). Je pense qu'il faut que j'utilise un compteur ? Mais je ne sais pas trop comment.

Normalement la feuille 1 est la première photo du PDF et la feuille 2 est la seconde
Merci pour votre aide
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
530
Bonjour,

Donc l'instruction définissant la plage est celle-ci :
Set plage = .Range("J12:B12" )

Par ailleurs, il n y a qu'une seule feuille dans votre PDF et c'est apparemment la feuille 2. 


Pour copier en dessous de la ligne 12 de la feuille 1

For Each cel In plage
If cel = valcherch Then
Set cel_fin = cel.EntireColumn.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
Range(cel, cel_fin).Copy
Worksheets("Feuil2").Range("B9:B17").Select
Selection.Insert Shift:=xlDown
End If
Next cel
Voici le lien du document excel complet:
http://www.cjoint.com/c/FFutG1CTrhv

Il me semble qu'il faut que je modifie la plage pour qu'elle corresponde à celle de la feuille 2 non ?
Pourriez-vous s'il vous plait m'expliquer en détail ce que fait l'instruction :
Set cel_fin = cel.EntireColumn.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
svp ?

Merci
Le code fonctionne merci !!
est-ce possible de copier uniquement les 3 lignes en dessous de chaque colonne où il y a écrit milka ?
Je suppose qu'il faut indiquer la plage ? Mais comme je ne comprends pas bien l'instruction ci-dessus j'ai du mal à voir comment faire
J'aimerais obtenir ceci:
http://www.cjoint.com/xxxxxxx

Merci beaucoup

---
(Lien cjoint supprimé par la modération à ma demande de l'utilisateur).
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
530
Cette instruction
Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)

fournit la dernière cellule (xlPrevious) dans la dernière colonne utilisée via recherche dans la plage considérée par colonne (SearchOrder) de n'importe quelle donnée ("*") .


ci-dessous nouvelle version du code
Sub Renouvellement()
     
     Dim plage As Range, cel As Object
     Dim valcherch As String
     Dim i As Integer
     
     Application.ScreenUpdating = False
     valcherch = "milka"
     With Worksheets("Feuil1")
         Set dernière_cellule_utilisée = .Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
         Set plage = .Range(.[A12], dernière_cellule_utilisée)
     End With
    
     i = 0
     For Each cel In plage
        If cel = valcherch Then
            Set cel_début = cel.Offset(1)
            Set cel_fin = cel.Offset(3)
            Range(cel_début, cel_fin).Copy
            Worksheets("Feuil2").[B9].Offset(i).PasteSpecial
            i = i + 3
        End If
     Next cel
     
     Application.ScreenUpdating = True

End Sub
Ah d'accord ! Je comprends mieux merci !
J'ai testé le code. Il fonctionne mais uniquement sur la première ligne.
Serait-il possible de l'appliquer aux lignes du dessous ? (ligne 16 et 20 par exemple ?) J'ai essayé de changer dans set plage mais cela fait tout buguer. Je crois que je n'ai pas bien compris comment utiliser cette instruction. Pourriez-vous m'éclairer svp ? J'aimerais comprendre afin de pouvoir l'utiliser par moi-même à l'avenir !

Merci pour tout
Cordialement
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
530
Avec l'exemple fourni, la dernière cellule de la dernière colonne utilisée est F19.
La plage utilisée dans le code représente donc les cellules de A12 à F19.
Rien ne t'empêche de déclarer une plage nominativement, comme ceci
Set plage = .Range(.[A12], .[J23])

ou
Set plage = .[A12:J23].Cells


[A12] est la notation simplifiée de range("A12")
 
Je comprends beaucoup mieux !!
Merci beaucoup !!