Copier les valeurs d'une feuille avec vba

Bonjour,

je suis débutante avec vba et j'aurai besoin de votre aide. Je voudrai à partir de valeurs contenues dans une feuille excel pouvoir les recopier en cliquant sur un bouton valider.

Merci de votre aide
Configuration: Windows XP
Internet Explorer 7.0

13 réponses

  1. Salut marina,
    ta demande n'est vraiment pas très explicite, mais je suis sûr que tu peux t'en sortir par toi-même.
    Même débutante en VBA, ce que tu peux faire pour commencer, c'est utiliser l'enregistrement automatique de macros :
    Outils/Macro/Nouvelle Macro / donne un nom puis OK
    A partir de là, toutes les opérations que tu réalises manuellement sont enregistrées en VBA.
    Tu peux donc faire manuellement tes copies de cellules, puis cliquer sur "Arrêter l'enregistrement de la macro".
    Ainsi, tu auras fait le plus gros du boulot.
    Retrouve ensuite ta macro : Outils/Macro/ nom de ta macro puis Modifier.
    Elle devrait commencer par
    Sub Macro1() 

    Tu remplaces cette ligne par
    Private Sub NomduBouton_Click()

    où NomduBouton est le nom du bouton Valider que tu auras créé.
    S'il y a alors des choses qui ne marchent pas ou que tu ne comprends pas, reviens donc vers nous.
    A suivre...
    0
    1. C'est impécable, je te remercie ça marche. cependant, j'aurai voulu changer de ligne pour chaque saisie différente (à chaque fois que je clique sur le bouton) pour pouvoir collecter toutes les commandes effectuées.
      En tout cas merci pour tout
      0
  2. Bon, maintenant que tu as une base, tu peux :
    1°-ré-expliquer clairement ce que tu veux faire
    2°-copier ici la macro que tu utilises, afin qu'on voit ce qu'on doit y modifier.
    A suivre...
    0
    1. Alors en fait je veux faire un programme pour gérer les stocks de fournitures administratives.
      Dans une feuille les différents services de la clinique sélectionnent ce qu'ils ont besoin à l'aide d'une liste de choix pour les produits, la quatité et le service demandeur comme ci-dessous par exmple.

      Date 23/06/08
      service ambulatoire
      Produit 10
      Quantité + 15

      Du coup à chaque fois que je clique sur le bouton valider, ces données vont se recopier dans une autre feuille "commandes". Ces valeurs vont se recopier su la première ligne, et je voudrais qu'à chaque fois qu'on clique sur valider, les données se recopient les unes après les autres sans se remplacer.

      Voici ma macro

      Sub saisieservices()
      '
      ' saisieservices Macro
      ' Macro enregistrée le 23/06/2008 par Marina
      '

      '
      Range("B2").Select
      Selection.Copy
      Sheets("validation commandes").Select
      Range("A3").Select
      ActiveSheet.Paste
      Sheets("saisie services").Select
      Range("B3").Select
      Application.CutCopyMode = False
      Selection.Copy
      Sheets("validation commandes").Select
      Range("B3").Select
      ActiveSheet.Paste
      Sheets("saisie services").Select
      Range("B4").Select
      Application.CutCopyMode = False
      Selection.Copy
      Sheets("validation commandes").Select
      Range("C3").Select
      ActiveSheet.Paste
      Sheets("saisie services").Select
      Range("B5").Select
      Application.CutCopyMode = False
      Selection.Copy
      Sheets("validation commandes").Select
      Range("D3").Select
      ActiveSheet.Paste
      End Sub

      Merci encore
      0
  3. D'abord, on va simplifier un peu tout ça.
    Connais-tu le collage spécial "transposé" ? tu copies une colonne, tu fais clic droit/collage spécial, tu sélectionnes l'option "Transposé" et ça te colle tes données... en ligne !!
    ça va nous permettre de tout coller d'un coup au lieu de copier/coller chaque cellule.

    Ensuite, pour coller à la suite, on va utiliser la propriété End(xldown) qui permet d'accéder à la dernière ligne vers le bas.

    Je me permets donc de corriger ta macro comme suit :
    Sub marina()
    Sheets("saisie services").Select
    Range("B2:B5").Copy
        
    Sheets("validation commandes").Range("A2").End(xlDown).Offset(1, 0) _
                    .PasteSpecial Paste:=xlPasteValues, Transpose:=True
    
    Application.CutCopyMode = False
    
    Exit Sub

    Dis-moi si ça fonctionne bien chez toi.
    A suivre...
    0
    1. Ca me met erreur d'exécution 1004, débogage. Ca veut dire quoi? je suis désolée, je suis pas très douée!

      Merci
      0
      1. Dans ta feuille "Validation commandes", est-ce que tu as une ligne d'en-tête ? Je suppose qu'elle ne se trouve pas sur la ligne 2. Essaie donc plutôt le code ci-dessous (qui devrait marcher quelle que soit ta ligne d'en-tête).
        Sub marina()
        Sheets("saisie services").Select
        Range("B2:B5").Copy
            
        Sheets("validation commandes").Cells(Columns(1).Cells.Count, 1) _
                        .End(xlUp).Offset(1, 0) _
                        .PasteSpecial Paste:=xlPasteValues, Transpose:=True
        
        Application.CutCopyMode = False
        
        End Sub

        Est-ce que c'est mieux ?
        A suivre...
        0
        1. Est-ce-qu'il est possible de vous faire parvenir mon fichier excel pour que vous puissiez voir directement ce que je veux faire et ma macro?
          0
          1. Bien sûr !
            tu peux le mettre sur www.cijoint.fr et nous transmettre ensuite le lien qui nous permettra d'aller le chercher.
            Supprime avant ce que tu peux avoir de confidentiel dans ton fichier.
            I.
            0
            1. Bonjour,

              Voici comme prvu le lien où j'ai déposé mon travail avec les macros.
              http://www.cijoint.fr/cjlink.php?file=cj200806/cijjx4HBvR.xls

              En fait le passage de saisie services à validation commandes marche, mais la suite ne marche pas.
              - Je souhaiterais pouvoir recopier les données de la feuiille validation des commandes uniquement pour celles qui sont validées, et pouvoir les trier par produits.

              Merci,

              Marina
              0
          2. Salut Marina,
            j'ai apporté quelques petites corrections à ta procédure "validation".
            Pour le tri par produit, tu peux t'aider de l'enregistrement automatique de macros.
            I.
            Sub validation_Corrige()
            Dim derlig As Integer, i As Integer
            Dim validée As String
            
            Application.ScreenUpdating = False
            With Sheets("commande")
                derlig = .Range("A65536").End(xlUp).Row + 1
            End With
            Sheets("validation commandes").Activate
            For i = Sheets("validation commandes").Range("E65536").End(xlUp).Row To 2 Step -1
                validée = LCase(Cells(i, 5).Value)
                If validée = "oui" Then
                    With Sheets("commande")
                        .Cells(derlig, 1) = Sheets("validation commandes").Cells(i, 3)
                        .Cells(derlig, 2) = Sheets("validation commandes").Cells(i, 1)
                        .Cells(derlig, 3) = Sheets("validation commandes").Cells(i, 4)
                        derlig = derlig + 1
                    End With
                End If
            Next
            Sheets("commande").Activate
            Application.ScreenUpdating = True
            End Sub
            0
            1. Ok, je te remercie pour ton aide. Je crois que j'ai terminé de t'embêter pour l'instant.
              Merci encore.
              0
            2. Coucou, je suis à nouveau embêter avec vba..décidemment!

              Alors en fait je voudrai copier les valeurs de trois colonnes les unes après les autres.
              Par exemple, soit un tableau avec 3 colonnes (A,B,C) et X lignes. Je voudrai copier chaque ligne à l'aide du bouton valider,( là le tableau de saisie s'initialise), et la nouvelle saisie se recopie à la suite de l'autre.

              En fait j'aimerai recopier toutes les valeurs en concervant les anciennes.

              Merci
              0
          3. Bonjour Marina, ça faisait longtemps !
            ta question, posée abruptement, reste assez obscure.
            je te propose à nouveau de joindre un exmeple de ton fichier et d'exposer ta problématique plus clairement, en disant quelles feuilles sont concernées, quelles colonnes, quel tableau tu veux initialiser, quelles anciennes valeurs doivent être conservées, tout ça...
            I.
            0
            1. http://www.cijoint.fr/cjlink.php?file=cj200806/cijqOTCTVR.xls

              J'aimerai recopier les valeurs de la feuille "saisie mvt nathalie" dans la feuille "suivi commandes nathalie" pour chaque saisie différente en conservant les anciennes valeurs.

              J'espère que je suis plus claire.

              Merci
              0
              1. Pour que les lignes se recopient bien les unes à la suite des autres, il faut corriger la ligne
                ligne = .Range("A3:C20").Row + 1

                en
                ligne = .Range("A3").End(xlDown).Row + 1

                ou bien
                ligne = .Range("A65536").End(xlUp).Row + 1

                ça, tu aurais pu trouver toute seule, puisque tu l'as déjà utilisé dans ta procédure "transfert_base_service" !!
                0
                1. et pour recopier toutes les lignes une par une, on peut rajouter une boucle While...Wend
                  (ça tourne en boucle tant qu'on trouve une valeur dans la colonne B)
                  Note que tu aurais pu faire une macro avec un simple copier/coller d'une feuille à l'autre, c'était une autre solution.
                  Sub saisie_commandes_nathalie_corrige()
                  
                  Sheets("saisie mvt nathalie").Activate
                  Range("A5").Select
                  
                  While ActiveCell.Offset(0, 1).Value <> ""
                      With Sheets("suivi commandes nathalie")
                          ligne = .Range("A65536").End(xlUp).Row + 1
                          .Cells(ligne, 1) = ActiveCell.Value
                          .Cells(ligne, 2) = ActiveCell.Offset(0, 1).Value
                          .Cells(ligne, 3) = ActiveCell.Offset(0, 2).Value
                      End With
                      ActiveCell.Offset(0, 2).ClearContents
                      ActiveCell.Offset(1, 0).Activate
                  Wend
                  Range(Range("B5"), Range("B5").End(xlDown)).ClearContents
                  End Sub

                  Bonne continuation.
                  I.
                  0
                  1. Bonjour Ivan, j'aurai à nouveau besoin de ton aide..

                    Je voudrai pouvoir à partir de la feuille "récap livraison services" recopier les valeurs dans la feuille correspondante. Par exemple toute les commandes du service maternité dans la feuille "commandes maternité", les commandes du service chirurgie dans la feuille "commandes chirurgie", et ainsi de suite. J'ai réalisé une macro qui me met les données dans les bonnes feuilles mais le problème c'est qu'elle ne me les met pas au début du tableau et que quand je refais une saisie de commande par service, elle m'efface les anciennes données en les remplaçant par la nouvelle saisie.

                    Voici mon fichier avec ma macro.
                    http://www.cijoint.fr/cjlink.php?file=cj200807/cija3wFcub.xls

                    Je te remercie pour ton aide
                    0
                2. Salut Marina,
                  tu fais une erreur sur le calcul de ta variable derlig. La variable derlig doit prendre le numéro de la dernière ligne de la feuille de commandes par service, et non pas de la feuille "récap livraison service".
                  Supprime la partie ci-dessous, qui ne sert à rien :
                  With Sheets("récap livraison services")
                      derlig = .Range("A65536").End(xlUp).Row + 1
                  End With

                  Et fais ton calcul de derlig dans chaque bloc If :
                  If Service = "maternité" Then
                          With Sheets("commandes maternité")
                              derlig = .Range("A65536").End(xlUp).Row + 1
                              .Cells(derlig, 1) = Sheets("récap livraison services").Cells(i, 1)
                              .Cells(derlig, 2) = Sheets("récap livraison services").Cells(i, 3)
                              .Cells(derlig, 3) = Sheets("récap livraison services").Cells(i, 4)
                        End With
                      End If

                  A suivre...
                  0