Macro copie cellules

Résolu
ram43 Messages postés 25 Statut Membre -  
cs_Le Pivert Messages postés 8437 Statut Contributeur -


Bonjour à tous,

Je viens voir si je peux trouver des renseignement utiles pour une macro que j'essaie de crée.
J'utilise surtout les macro auto mais avec ce que j'essaie de faire ça ne vas pas suffire je pense.

Comme on peut le voir sur l'image il s'agit un petit planning conducteur.
Pour avoir moins de saisie à faire je souhaiterais ne pas avoir à compléter à chaque fois la partie du bas qui est une feuille pour les conducteur qui reprend les informations dans les lignes en haut.

La partie du bas comprend 2 feuilles de conducteurs qui j'imprime ensuite.
Mon idée serai d'avoir une macro qui me permet avec un bouton par exemple de renseigner les cellules de la partie gauche de la feuille en bas et une autre macro, la même mais pour la partie droite.
Pour cela il faut que il y ai par exemple une boite de dialogue qui demande quelle ligne copier.
Aussi pour la cellule qui renseigne le nom du conducteur il faut garder que les lettres et pas le numéro de tel qui suit après sachant que le nombre de lettres n'est pas fixe.
Et bien attendu avec la copie des cellules ne copier que les valeurs et pas le format de la cellule copier.

Voilà voilà, si vous avez des idées je suis preneur. En attendent je vais voir ce que je peux faire déjà.

3 réponses

  1. ram43 Messages postés 25 Statut Membre 55
     


    Petit aperçu de mon avancement jusqu'à maintenant et l'idée que je me fais du code à faire.
    0
    1. ram43 Messages postés 25 Statut Membre 55
       
      Début de code :

      'Macro_3
      'Copie des valeur d'une ligne de tournée dans les cellules pour la fiche conducteur
      'Bouton pour activer macro
      'Début de la procédure
      Sub Macro_3()

      'Test marco pas à pas F8
      MsgBox ("Test macro pas à pas F8")

      'Déclaration des variables
      Dim Ligne As Integer
      Dim Conducteur As String
      Dim HeureEmbauche As Variant
      Dim Tracteur As Variant
      Dim Remorque As Variant
      Dim Chargement As String
      Dim Lieu As String
      Dim Horaire As Variant
      Dim DateJour As Date

      'Affectation des variables
      DateJour = Range("B1").Value
      Ligne = InputBox("quelle ligne copier?")

      'While x

      'Affecataion des cellules
      'Date
      Range("B22").Value = DateJour
      'Entete
      Range("C23").Value
      Range("E23").Value
      Range("C24").Value
      Range("E24").Value
      'Chargement
      Range("B26").Value
      Range("C26").Value
      Range("E26").Value
      'Début de la boucle

      'If
      'Si ligne x alors cellules y
      'Affecter valeur varaibles (copier valeur de la ligne x)
      'Affectetation des
      'Endif

      'Variable :
      'ligne à copier
      'cellules à copier
      '
      'copier les que lettres cellule conducteur
      'suprimer suffixe vide et espace cellule chargement
      '
      'Boite de dialogue numero ligne
      'Copier cellule x si ligne y
      '
      'Messqge de sortir
      MsgBox ("Programme terminé")

      'fin de la procédure
      End Sub
      0
    2. ram43 Messages postés 25 Statut Membre 55
       
      Il faudra une boucle car la longueur de la ligne est variable au nombre de chargements.
      Les variables auront plusieurs valeurs à chaque ligne.
      Et il faut changer de ligne dans la feuille du bas pour chaque chargement.
      0
    3. ram43 Messages postés 25 Statut Membre 55
       
      Test pour une ligne saisie à la main fonctionne bien :

      Sub COPIE()

      'Déclaration des variables
      Dim DateJour As Date
      Dim Ligne As Integer
      Dim Conducteur As String
      Dim HeureEmbauche As Variant
      Dim Tracteur As Variant
      Dim Remorque As Variant
      Dim Chargement As String
      Dim Lieu As String
      Dim Horaire As Variant


      'Affectation des variables
      DateJour = Range("B1").Value
      Ligne = InputBox("quelle ligne copier?")

      'copier les que lettres cellule conducteur
      'suprimer suffixe vide et espace cellule chargement
      'Copier cellule x si ligne y

      'Début de la boucle

      'Si Ligne = x
      'Alors Varaibles du chargement sont y

      'If
      'Si ligne x alors cellules y
      'Affecter valeur varaibles (copier valeur de la ligne x)
      'Endif

      'Affectation des variables en fonction de la variable ligne
      Conducteur = Range("A3").Value
      Tracteur = Range("B3").Value
      Remorque = Range("C3").Value
      HeureEmbauche = Range("D3").Value

      'Affectation des variables en fonction du chargement
      Chargement = Range("I3").Value
      Lieu = Range("I3").Value
      Horaire = Range("H3").Value

      'While x = non vide
      'nouvelle boucle pour nouvelle ligne de chargement

      'Affecataion des cellules
      'Date
      Range("B22").Value = DateJour
      'Entete feuille
      Range("C23").Value = Conducteur
      Range("E23").Value = HeureEmbauche
      Range("C24").Value = Tracteur
      Range("E24").Value = Remorque
      'Faire une boucle pour les chargement avec saut d'une ligne pour un nouveau chargement
      'Chargement 1
      Range("B26").Value = Chargement
      Range("C26").Value = Lieu
      Range("E26").Value = Horaire
      'Chargement 2
      Range("B28").Value = Chargement
      Range("C28").Value = Lieu
      Range("E28").Value = Horaire
      'Chargement 3
      Range("B30").Value = Chargement
      Range("C30").Value = Lieu
      Range("E30").Value = Horaire

      'Message de sortie
      MsgBox ("Données copiées")

      'fin de la procédure

      End Sub
      0
    4. ram43 Messages postés 25 Statut Membre 55
       
      Peut-être une macro qui en appelle une autre pour pouvoir avoir des cellules variables en fonction de la ligne saisie.
      0
    5. ram43 Messages postés 25 Statut Membre 55
       
      Nouveau code, fonctionne bien dans l'idée mais reste à faire en sorte de ne copier qu'une partie de certaines cellules :

      Sub FEUILLE1()

      'Sauvegarder du fichier avant modification par la maccro
      'ActiveWorkbook.Save

      'Déclaration des variables
      Dim DateJour As Date
      Dim Ligne As Integer
      Dim i As Integer
      Dim Conducteur As String
      Dim HeureEmbauche As Variant
      Dim Tracteur As Variant
      Dim Remorque As Variant
      Dim Chargement As String
      Dim Lieu As String
      Dim Horaire As Variant

      i = 3

      'Affectation des variables
      DateJour = Range("B1").Value
      i = InputBox("quelle ligne copier?")

      ActiveWindow.Panes(1).Activate
      Columns("A:W").Rows(i).Select

      'copier les que lettres cellule conducteur
      'suprimer suffixe vide et espace cellule chargement

      'Début de la boucle

      'Demande de confirmation pour vider la feuille
      If MsgBox("Copier la ligne?", vbYesNo, "Demande de confirmation") = vbYes Then

      'Affectation des variables en fonction de la variable ligne
      Conducteur = Range("A" & i).Value
      Tracteur = Range("B" & i).Value
      Remorque = Range("C" & i).Value
      HeureEmbauche = Range("D" & i).Value

      'Affectation des variables en fonction du chargement
      Chargement = Range("I" & i).Value
      Lieu = Range("I" & i).Value
      Horaire = Range("H" & i).Value


      'Affecataion des cellules
      'Date
      Range("B22").Value = DateJour
      'Entete feuille
      Range("C23").Value = Conducteur
      Range("E23").Value = HeureEmbauche
      Range("C24").Value = Tracteur
      Range("E24").Value = Remorque
      'Faire une boucle pour les chargement avec saut d'une ligne pour un nouveau chargement
      'Chargement 1
      Range("B26").Value = Chargement
      Range("C26").Value = Lieu
      Range("E26").Value = Horaire
      'Chargement 2
      Range("B28").Value = Chargement
      Range("C28").Value = Lieu
      Range("E28").Value = Horaire
      'Chargement 3
      Range("B30").Value = Chargement
      Range("C30").Value = Lieu
      Range("E30").Value = Horaire

      End If

      'Message de sortie
      MsgBox ("Données copiées")

      'fin de la procédure

      End Sub
      0
  2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bonjour,

    Pour faire ce que tu veux, il suffit de se servir de l’événement Feuille BeforeDoubleClick

    Tu fais Alt F11 pour allez dans le module de ta feuille 7 et mettre ce code qui se déclenchera au double clic sur les chauffeurs, les tracteurs et les remorques:

    Option Explicit
    Dim nom As String
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, Range("A3:A8")) Is Nothing Then
    nom = Target.Value
    extractionMots
    Range("C23").Value = nom 'chauffeur
    End If
    If Not Intersect(Target, Range("B3:B7")) Is Nothing Then
    Range("C24").Value = Target.Value 'tracteur
    End If
    If Not Intersect(Target, Range("C3:C7")) Is Nothing Then
    Range("E24").Value = Target.Value 'remorque
    End If
    End Sub
    'Extraire les données séparées par un espace dans une chaine de caractères
    Sub extractionMots()
        Dim Tableau() As String
        Dim i As Integer
        
        'découpe la chaine en fonction des espaces " "
        'le résultat de la fonction Split est stocké dans un tableau
        Tableau = Split(nom, "   ")
        
        'boucle sur le tableau pour visualiser le résultat
        For i = 0 To UBound(Tableau)
            'Le résultat s'affiche dans la fenêtre d'execution de l'éditeur de macros
            Debug.Print Tableau(i)
        Next i
        nom = Tableau(0) 'nom du chauffeur seul
    End Sub
    
    


    Voila, ya pas plus simple!
    0
    1. ram43 Messages postés 25 Statut Membre 55
       
      Bonjour cs_Le Pivert,

      Merci pour ta réponse.
      Je vais lire et essayer de comprendre ça comme il faut pour pourvoir l'intégrer à mon macro.
      0
    2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      pour pourvoir l'intégrer à mon macro.

      Tu n'as rien à integrer a tes macros!
      c'est une macro qui se déclenche au double clic sur une cellule!

      voir ceci pour mieux comprendre les événements feuille:

      https://silkyroad.developpez.com/VBA/EvenementsFeuille/#LI



      @+
      0
    3. ram43 Messages postés 25 Statut Membre 55
       
      Ha oui en effet je ne suis pas du tout familier avec les événements feuille.
      Je vais voir si c'est plus clair avec un peu de lecture sur le sujet.

      Merci.
      0
    4. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Sinon je t'envoie ton classeur!

      Mais je pense que tu vas y arriver, ce n'est pas sorcier de faire Alt F11 sur ton interface pour accéder au module de ta feuille et y mettre ce code!
      0
    5. ram43 Messages postés 25 Statut Membre 55
       
      Oui merci j'ai bien copié ton code dans la partie Worksheet et ça fonctionne bien comme tu dis. Cela copie le nom du conducteur. Après j'essaie de comprendre le code aussi et voir si ça me convient comme solution :)
      0
  3. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Voir capture d'écran:


    0
    1. ram43 Messages postés 25 Statut Membre 55
       
      La Marco fonctionne plus ou moins bien. Sur certains cellules ça copie quand-même le numéro.
      Je continue à essayer d'avoir une fonctionnalité similaire qui serait dans la macro que j'ai et qui copie tout d'un coup après une action sur le bouton. Pour la partie copier c'est bon, il me manque encore un moyen pour sélectionner qu'une partie de certaines cellules (que le nom du conducteur / pour le changement prendre tout avant ou après le premier espace).
      0
    2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Sur certains cellules ça copie quand-même le numéro.

      C'est normal si tu lis cela:

      'Extraire les données séparées par un espace dans une chaine de caractères

      Dans mon exemple j'ai mis 3 espaces pour aller avec les premières ligne. Mais par la suite tu as des numéros qui sont collés au nom!
      Cela ne peut fonctionner

      en vba il faut être rigoureux et faire les saisies dans le cellules correctement.

      Le code que je t'ai donné est le plus efficace pour ce que tu veux faire.

      Il va falloir que tu corriges tes cellules en mettant le même nombre d'espaces dans chacunes d'elles.

      J'ai mis cela aussi, cela s’arrête en A8, il faut le corriger en mettant la dernière cellule saisie dans la colonne

      If Not Intersect(Target, Range("A3:A8"))


      Voilà
      0
    3. ram43 Messages postés 25 Statut Membre 55
       
      J'apprécie tes conseils.

      Je ne suis pas l'auteur du document, j'essaie de réduire le temps de saisie que j'ai à faire dessus.

      Quand ça sera possible je pourrais adapter le tableur et la saisie des cellules ce qui n'est pas le cas aujourd'hui.

      J'ai une vingtaine de lignes alors j'ai rallongé jusqu'à "A25"
      If Not Intersect(Target, Range("A3:A25")) Is Nothing Then
      


      Je n'ai pas encore saisie comment fonctionne l'ensemble de ton code.
      J'ai vu que le code permet avec un double-clic de copier et coller une cellule dans une autre.
      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      

      Et que avec la fonction Split on arrive à garder qu'une partie des caractères.
      Tableau = Split(nom, "   ")
      


      Cependant j'ai surement pas saisie toute les fonctionnalités de ta macro et son efficacité. Car ce que j'ai cherché à faire avec la macro que j'ai édité moi même c'est d'avoir une copie de toutes les cellules dont j'ai besoin en un clic.

      Merci pour ta patience et tes réponses.
      0
    4. ram43 Messages postés 25 Statut Membre 55
       
      Où j'en suis actuellement.

      https://www.cjoint.com/c/HChqhO1yt5c
      0
    5. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Je t'ai fait un exemple pour la macro Feuille2, tu verras la différence avec la tienne:

      https://www.cjoint.com/c/HCihoSljkvQ


      @+ Le Pivert
      0