Déplacer colonnes en fonction valeur cellule

Résolu
kiju9634 -  
 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

  1. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    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.
     
    0
    1. kiju9634
       
      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 !
      0
  2. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    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).
    0
    1. Kiju9634
       
      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.
      0
  3. Kiju9634
     
    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
    0
  4. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    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
    0
    1. kiju9634
       
      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
      0
    2. kiju9634
       
      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).
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    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
    0
    1. kiju9634
       
      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
      0
  7. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    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")
    0
    1. kiju9634
       
      Je comprends beaucoup mieux !!
      Merci beaucoup !!
      0