Menu

Macro copie cellules [Résolu]

ram43 25 Messages postés mardi 15 janvier 2013Date d'inscription 12 mars 2018 Dernière intervention - 2 mars 2018 à 12:13 - Dernière réponse : cs_Le Pivert 5180 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention
- 12 mars 2018 à 12:50


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à.

Afficher la suite 

Votre réponse

34 réponses

ram43 25 Messages postés mardi 15 janvier 2013Date d'inscription 12 mars 2018 Dernière intervention - 2 mars 2018 à 13:09
0
Merci


Petit aperçu de mon avancement jusqu'à maintenant et l'idée que je me fais du code à faire.
ram43 25 Messages postés mardi 15 janvier 2013Date d'inscription 12 mars 2018 Dernière intervention - 7 mars 2018 à 10:46
L'idée que j'ai c'est d'utiliser une ou des fonctions comme Left() , InStr(), Len() pour trouver l'espace dans la chaîne de caractère et puis copier uniquement les valeurs après l'espace.
ram43 25 Messages postés mardi 15 janvier 2013Date d'inscription 12 mars 2018 Dernière intervention - 7 mars 2018 à 11:21
Rien qui fonctionne pour l'instant:

    'If InStr(Range("E" & i), " ") > 0 Then
    'Lieux1 = Right(InStr(Range("E" & i), " ") - 1)
    'Lieux1 = Left(Range("E" & i), InStr("E" & i, " "))
    'Lieux1 = Left(Range("E" & i), InStr("E" & i, "-- ") + 1)
    'mid(Chaine, InStr(Chaine, "-") + 1)
    'instr(chaine,"-")-1)
    'Lieux1 = Right(Range("E" & i), Length("E" & i) - InStr("E" & i, " "))
    'Lieux1 = Right("E" & i, Len("E" & i) - InStr("E" & i, ""))
ram43 25 Messages postés mardi 15 janvier 2013Date d'inscription 12 mars 2018 Dernière intervention - 7 mars 2018 à 11:45
J'ai essayé avec :
Lieu4 = Mid(Range("N" & i), 5)

Sauf que vu que le nombre de caractères est variable ça affiche pas toujours uniquement le chargement.
ram43 25 Messages postés mardi 15 janvier 2013Date d'inscription 12 mars 2018 Dernière intervention - 7 mars 2018 à 12:19
Je tiens quelque-chose mais c'est pas encore exactement ça :
Lieu1 = Mid(Range("E" & i), InStr(("E" & i), " ") + 6)

Cela retourne encore le début des caractères de la cellule copier avant le premier espace.
cs_Le Pivert 5180 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 7 mars 2018 à 12:29
Vu que tu n'écoutes pas les conseils que l'on te donne, je te laisse suivre le chemin que tu as choisi!

Bon courage
Commenter la réponse de ram43
cs_Le Pivert 5180 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 6 mars 2018 à 16:46
0
Merci
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!
ram43 25 Messages postés mardi 15 janvier 2013Date d'inscription 12 mars 2018 Dernière intervention - 6 mars 2018 à 16:54
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.
cs_Le Pivert 5180 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 6 mars 2018 à 17:03
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:

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



@+
ram43 25 Messages postés mardi 15 janvier 2013Date d'inscription 12 mars 2018 Dernière intervention - 6 mars 2018 à 17:11
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.
cs_Le Pivert 5180 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 6 mars 2018 à 17:13
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!
ram43 25 Messages postés mardi 15 janvier 2013Date d'inscription 12 mars 2018 Dernière intervention - 6 mars 2018 à 17:25
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 :)
Commenter la réponse de cs_Le Pivert
cs_Le Pivert 5180 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 6 mars 2018 à 17:23
0
Merci
Voir capture d'écran:


cs_Le Pivert 5180 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 8 mars 2018 à 14:18
Tu peux aussi faire une Sub paramétrable, où il ne te restera qu'a mettre les données comme ceci:

Option Explicit
Dim gauche As String
Dim droite As String
Private Sub CommandButton1_Click()
Range("A1").Value = "dupont 0123456789"
scinder (Range("A1").Value)
Range("B1").Value = gauche
Range("C1").Value = droite
End Sub
Sub scinder(ByVal var As String)
Dim espace As Integer
Dim longueur As Integer
longueur = Len(var)
espace = InStr(var, " ") 'détermine la position de l'espace ou tout autre signe
gauche = Left(var, espace) '1ère partie avant l'espace ou tout autre signe
droite = Right(var, longueur - espace) 'seconde partie après l'espace ou tout autre signe
End Sub


Plus facile à utiliser!
ram43 25 Messages postés mardi 15 janvier 2013Date d'inscription 12 mars 2018 Dernière intervention - 9 mars 2018 à 11:59
Bonjour,

J'ai pu voir ton fichier avec le nouveau lien.

Il est bien ce site http://silkyroad.developpez.com/VBA/ManipulerChainesCaracteres/#LI-A .
Je l'avais vu mais j'avais pas réussit à faire fonctionner ces fonctions.
Surement des erreurs d'écriture de ma part.

C'est pratique d'avoir mis la déclaration des variables en haut,
Option Explicit
'Déclaration des variables
Dim DateJour As Date

Et d'avoir limité la saisie, ça évite les erreurs de saisie trop grande
If i > 20 Then Exit Sub


Si j'ai bien compris t'as donc rajouté une variable qui vient récupérer les infos dans un tableau
Sub extractionchargement1()
    Dim Tableau() As String

Et que c'est dans le tableau que tu utilise la fonction Split pour garder que la partie souhaité
Tableau = Split(Chargement1, " ")

Qu'on peut ensuite récupérer
    Lieu4 = Replace(Range("S" & i).Text, Chargement4, "")
    Range("G38").Value = Lieu4


Un grand merci à toi pour ton aide.
cs_Le Pivert 5180 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 9 mars 2018 à 12:13
j'ai travaillé pour toi. j'ai simplifié le code et mis des InputBox numériques pour éviter les fautes de saisies:

Option Explicit
'Déclaration des variables
Dim DateJour As Date
Dim i As Integer
Dim Conducteur As String
Dim gauche As String
Dim droite As String
Sub FEUILLE1()
'Sauvegarder du fichier avant modification par la maccro
'ActiveWorkbook.Save
Dim Horaire4 As Variant
i = 3
'Affectation des variables
DateJour = Range("B1").Value
i = Application.InputBox("Quelle ligne copier?", "Saisie numérique", Type:=1)
Do While Not IsNumeric(i) Or Val(i) < 3 Or Val(i) > 20
 i = Application.InputBox("Quelle ligne copier?", "Saisie numérique", Type:=1)
Loop
'selection de la ligne demande
'ActiveWindow.Panes(1).Activate
Columns("A:W").Rows(i).Select
'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
     extractionMots
    Range("C29").Value = Conducteur
    Range("E29").Value = Range("D" & i).Value 'HeureEmbauche
    Range("C30").Value = Range("B" & i).Value ' Tracteur
    Range("E30").Value = Range("C" & i).Value 'Remorque
    'Date
    Range("B28").Value = DateJour
    'Affectation des variables en fonction du chargement(a faire)
    'Chargement 1
    scinder (Range("E" & i).Value)
    Range("B32").Value = gauche 'Chargement1
    Range("C32").Value = droite 'Lieu1
    Range("E32").Value = Range("H" & i).Value 'horaire1
    'Chargement 2
    scinder (Range("I" & i).Value)
    Range("B34").Value = gauche 'Chargement2
    Range("C34").Value = droite 'Lieu2
    Range("E34").Value = Range("L" & i).Value 'Horaire2
    'Chargement 3
    scinder (Range("N" & i).Value)
    Range("B36").Value = gauche 'Chargement3
    Range("C36").Value = droite 'Lieu3
    Range("E36").Value = Range("Q" & i).Value 'Horaire3
     'Chargement 4
    scinder (Range("S" & i).Value)
    Range("B38").Value = gauche 'Chargement4
    Range("C38").Value = droite 'Lieu4
    Range("E38").Value = Range("V" & i).Value 'Horaire4
   
    'Date
    Range("B22").Value = DateJour
    End If
'Message de sortie
MsgBox ("Données copiées")
'fin de la procédure
End Sub
Sub FEUILLE2()
'Sauvegarder du fichier avant modification par la maccro
'ActiveWorkbook.Save
i = 3
'Affectation des variables
DateJour = Range("B1").Value
i = Application.InputBox("Quelle ligne copier?", "Saisie numérique", Type:=1)
Do While Not IsNumeric(i) Or Val(i) < 3 Or Val(i) > 20
 i = Application.InputBox("Quelle ligne copier?", "Saisie numérique", Type:=1)
Loop
'selection de la ligne demande
'ActiveWindow.Panes(1).Activate
Columns("A:W").Rows(i).Select
'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
    extractionMots
    Range("G29").Value = Conducteur
    Range("I29").Value = Range("D" & i).Value 'HeureEmbauche
    Range("G30").Value = Range("B" & i).Value ' Tracteur
    Range("I30").Value = Range("K" & i).Value 'Remorque
    'Date
    Range("F28").Value = DateJour
    'Affectation des variables en fonction du chargement(a faire)
    'Chargement 1
    scinder (Range("E" & i).Value)
    Range("F32").Value = gauche 'Chargement1
    Range("G32").Value = droite 'Lieu1
    Range("I32").Value = Range("H" & i).Value 'horaire1
    'Chargement 2
    scinder (Range("I" & i).Value)
    Range("F34").Value = gauche 'Chargement2
    Range("G34").Value = droite 'Lieu2
    Range("I34").Value = Range("L" & i).Value 'Horaire2
    'Chargement 3
     scinder (Range("N" & i).Value)
    Range("F36").Value = gauche 'Chargement3
    Range("G36").Value = droite 'Lieu3
    Range("I36").Value = Range("Q" & i).Value 'Horaire3
     'Chargement 4
    scinder (Range("S" & i).Value)
    Range("F38").Value = gauche 'Chargement4
    Range("G38").Value = droite 'Lieu4
    Range("I38").Value = Range("V" & i).Value 'Horaire4
   'Date
    Range("B22").Value = DateJour
    End If
'Message de sortie
MsgBox ("Données copiées")
'fin de la procédure
End Sub
'Extraire les données séparées par un _ dans une chaine de caractères
Sub extractionMots()
    Dim Tableau() As String
    Dim i As Integer
     'découpe la chaine en fonction des "_"
    'le résultat de la fonction Split est stocké dans un tableau
    Tableau = Split(Conducteur, "_")
    '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
    Conducteur = Tableau(0) 'nom du chauffeur seul
End Sub
'Scinder les données séparées par un espace en 2 dans une chaine de caractères
Sub scinder(ByVal var As String)
Dim espace As Integer
Dim longueur As Integer
longueur = Len(var)
espace = InStr(var, " ") 'détermine la position de l'espace ou tout autre caractere
gauche = Left(var, espace) '1ère partie avant l'espace ou tout autre caractere
droite = Right(var, longueur - espace) 'seconde partie après l'espace ou tout autre caractere
End Sub



Voilà, il suffit de copier coller dans ton module de feuille

Dis-moi ce que tu en pense?

@+ Le Pivert
ram43 25 Messages postés mardi 15 janvier 2013Date d'inscription 12 mars 2018 Dernière intervention - 12 mars 2018 à 12:16
Salut,

C'est super je pense !

J'ai gardé le Split avec les 3 espaces et ça fonctionne bien.

Après j'ai verrouillé les feuilles pour que personne supprime ou insère une ligne car ça sinon ça ne copie plus au bon endroit ^^

Il y a un autre projet sur un autre fichier mais ça viendra dans un autre moment.

Merci :)
cs_Le Pivert 5180 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 12 mars 2018 à 12:50
Content d'avoir pu t'aider,

@+ alors

Le Pivert
Commenter la réponse de cs_Le Pivert