Archivage des lignes sélectionnées avec checkbox vers classeur

Bobman

XLDnaute Nouveau
Bonjour à toute la communauté,

je m'adresse à vous car je désespère vraiment à trouver une solution. Je souhaite copier mes lignes sélectionnées à l'aide d'un checkbox d'un classeur à un autre. Biensûr, le fichier de destination (classeur 2) est fermé donc il faut l'ouvrir, insérer, sauvegarder et quitter, j'ai déjà un bout de code qui pourrai correspondre :
Classeur1.Feuil1.C3:H3 > Classeur2.Feuil1.C3:H3

Pour ce qui est de la sélection à l'aide du check box je joint un fichier d'exemple.

Code:
    Sub Archivage()
    Dim Wb As Workbook
    Dim i As Byte
    Dim j As Integer

    Application.ScreenUpdating = False
    'ouvre le classeur 'essai1'
    Set Wb = Workbooks.Open("C:\Classeur2.xls")

    'determine la premiere ligne vide dans la 1ere feuille du classeur 'Feuil1'
    j = Wb.Sheets(1).Range("A65536").End(xlUp).Row + 1

    'transfet des données saisies dans la plage C1:H1 du classeur contenant cette
    'macro , vers le classeur2
    For i = 3 To 8
    Wb.Sheets(1).Cells(j, i) = ThisWorkbook.Sheets(1).Cells(2, i)
    Next i

    'referme le classeur 2 en sauvegardant les modifications
    Wb.Close True
    Application.ScreenUpdating = True
    End Sub
 

Pièces jointes

  • Check_box_selection.xls
    48.5 KB · Affichages: 46
  • Classeur1.xls
    25.5 KB · Affichages: 36
  • Check_box_selection.xls
    48.5 KB · Affichages: 46
  • Classeur1.xls
    25.5 KB · Affichages: 40
  • Check_box_selection.xls
    48.5 KB · Affichages: 46
  • Classeur1.xls
    25.5 KB · Affichages: 40

Robert

XLDnaute Barbatruc
Repose en paix
Re : Archivage des lignes sélectionnées avec checkbox vers classeur

Bonjour Bobman, bonjour le forum,

Là je dois partir et j'ai à peine ouvert ton classeur... Pourquoi n'utilises-tu pas une condition de couleur (Interior.ColorIndex) pour copier la ligne puisque les lignes cochées changent de couleur ? Du style :
Code:
For i = 3 To 8
     If ThisWorkbook.Sheets(1).Cells(2, i).Interior.Colorindex = XXX Then
          Wb.Sheets(1).Cells(j, i).Value = ThisWorkbook.Sheets(1).Cells(2, i).Value
     End if
Next i

Tu adapteras le XXX car je n'ai pas le temps de regarder...
 

Bobman

XLDnaute Nouveau
Re : Archivage des lignes sélectionnées avec checkbox vers classeur

Bonjour Robert, je précise que je suis débutant, j'ai commencé le vba début de semaine dernière, j'ai quelques notions mais insuffisante pour comprendre le code je t'envoie :(

Donc si tu peux écrire quelques commentaire dans le code, ce serait impeccable pour moi. Si je comprend bien, Interior.ColorIndex me permet de copier les cases qui sont uniquement grisées dans l'exemple, pour les recopier identiquement dans le classeur2 en conservant la couleur ? il ne faudrait pas que la couleur soit copiée, uniquement le contenu des cellules.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Archivage des lignes sélectionnées avec checkbox vers classeur

Bonjour Bobman, bonjour le forum,

En pièce jointe ton fichier modifié avec le code commenté ci-dessous :
Code:
Sub Archivage()
Dim ch As String 'déclare la variable ch (CHemin d'accès)
Dim cs As Workbook 'déclare la variable cs (Classeur Source)
Dim cc As Workbook 'déclare la variable cc (Classeur Cible)
Dim os As Object 'déclare la variable os (Onglet Source)
Dim oc As Object 'déclare la variable oc (Onglet Cible)
Dim dest As Range 'déclare la variable dest (cellule de DESTination)

Application.ScreenUpdating = True 'masque les changements à l'écran
Set cs = ThisWorkbook 'définit le classeur source cs
Set os = cs.Sheets("Feuil1") 'définit l'onglet source os
ch = cs.Path & "\" 'définit le chemin d'accès
Set cc = Workbooks.Open(ch & "Classeur1.xls") 'définit le classeur cible (en l'ouvrant)
Set oc = cc.Sheets("Feuil1") 'définit l'onglet cible
For x = 4 To 8 'boucle sur les 5 lignes
    If os.Cells(x, 2).Interior.ColorIndex = 15 Then 'condition : si la cellule de la ligne x en colonne 2 (=B) est grisée
        With oc 'prend en compte l'onglet cible oc
            'définit la cellule de destination dest (A1, si A1 est vide, sinon la première cellule vide de la colonne A de l'onglet cible
            Set dest = IIf(.Range("A1").Value = "", .Range("A1"), .Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
        End With 'fin de la prise en compte de l'onglet cible
        os.Cells(x, 2).Copy dest 'copie la cellule et la colle dans dest
    End If 'fin de la condition
Next x 'prochaine ligne de la boucle
cc.Close True 'ferme le classeur en enregistrant les modification
Application.ScreenUpdating = True 'affiche les changements à l'écran
End Sub
Pour que ça mache il faut qu'il y ait un classeur nommé Classeur1.xls ayant lui même un onglet nommé Feuil1, dans le même dossier que celui où se trouve ton classeur source : Check_box_selection.xls. Si un de ces paramètres n'est pas respecté la macro va planter...
Le fichier :
 

Pièces jointes

  • Check_box_selection.xls
    59.5 KB · Affichages: 47
  • Check_box_selection.xls
    59.5 KB · Affichages: 50
  • Check_box_selection.xls
    59.5 KB · Affichages: 48

Bobman

XLDnaute Nouveau
Re : Archivage des lignes sélectionnées avec checkbox vers classeur

Bonjour Robert,

Merci de ta patience et pour la clarté des commentaires, c'est une aubaine pour moi !

Donc j'ai essayé la macro on veillant à respecter les conditions, aucuns plantages mais un petit problème au niveau des cellules copiées à partir du dossier émetteur. En effet, les cellules sont copiés à partir de la colonne A et non C. De plus seule le contenu de la colonne A est copiée, les colonnes E, F, G et H ne sont pas copiées.
En regardant le code de plus prêt, j'ai changé la ligne suivante pour espérer régler une partie du problème :
Code:
Set dest = IIf(.Range("A1").Value = "", .Range("A1"), .Cells(Application.Rows.Count, 1).End(xlUp).Offset(1,
La ligne débute bien sur la colonne C mais le résultat attendu ne concorde pas aux attentes, voici le résultat dans le fichier de destination :
 

Pièces jointes

  • Classeur1.xls
    39 KB · Affichages: 45
  • Classeur1.xls
    39 KB · Affichages: 44
  • Classeur1.xls
    39 KB · Affichages: 44

Robert

XLDnaute Barbatruc
Repose en paix
Re : Archivage des lignes sélectionnées avec checkbox vers classeur

Bonjour Bobman, bonjour le forum,

C'est que tes fichiers exemple ne sont pas explicites, cellules fusionnées dans un classeur pas fusionnées dans l'autre, taille des colonnes complètement différentes, etc. Je te propose d'envoyer un fichier en pièce jointe montrant ce que tu as avant traitement (en remplissant la ou les lignes) et ce que tu veux après traitement. Je corrigerait le code en fonction...
 

Bobman

XLDnaute Nouveau
Re : Archivage des lignes sélectionnées avec checkbox vers classeur

Voici les 2 fichiers qui respect parfaitement le visuel.

En fait le système de checkbox n'est pas encore appliqué sur le fichier "Emetteur" d'où mes fichier de test. Ici l'exemple est concret. Les utilisateurs du fichier "Emetteur" doivent pouvoir sélectionner la ligne à l'aide du checkbox puis cliquer sur "Emettre demande" ce qui va copier les lignes sélectionnées dans le fichier "Destinataire". Par ailleurs, bien que je puisse essayer de le faire, serait-il possible d'indiquer un msgbox "Valider votre sélection ?" dans la condition If lorsque l'utilisateur clic sur "Emettre demande" sinon annuler l'opération ?

Pour les checkbox j'ai utilisé la version ActiveX, je ne sais pas quelle version sont utilisé dans l'exemple fournit précédemment. :confused: Si tu peut me fournir une explication sur l'ajout une case à cocher ?

Encore un grand merci à toi Robert
 

Pièces jointes

  • destinataire.xls
    48 KB · Affichages: 50
  • Emetteur.xls
    114 KB · Affichages: 47
  • destinataire.xls
    48 KB · Affichages: 47
  • Emetteur.xls
    114 KB · Affichages: 35
  • destinataire.xls
    48 KB · Affichages: 44
  • Emetteur.xls
    114 KB · Affichages: 40

Robert

XLDnaute Barbatruc
Repose en paix
Re : Archivage des lignes sélectionnées avec checkbox vers classeur

Bonjour Bobman, bonjour le forum,

Je t'avais pourtant demandé un fichier explicite. Tu me donnes un fichier émetteur vide, sans la coloration de la ligne sur la checkbox qui faisait agir le code... Je n'ai pas trouvé non plus Émettre la demande ? Quant au fichier destinataire (qui avant s'appelait Classeur2.xls !), il contient des validation de données ???
Fais un effort, sinon moi je n'en ferai plus...

Tu as écrit ce code :
Code:
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, _
ByVal Target As Range, ByVal Cancel As Boolean)
Cancel = True
End Sub
dans le composant Feuil1(Feuil1)... Pour que ça fonctionne il faudrait qu'il soit placé dans le composant ThisWorkbook...

Perso je supprimerais les checkboxes, esthétiques certes, mais lourdes à gérer et je sélectionnerais les lignes au double-clic ou en écrivant "X" dans la colonne A. Tu fais ta sélection tu cliques sur le bouton et le tour est jouer...
Un exemple dans ton fichier modifié ci-dessous. À double-clic la ligne est rajoutée à la sélection. À la fin tu choisis d'émettre et/ou de supprimer la sélection.
Tu vois, je fais l'effort de fournir un fichier exploitable et d'expliquer les codes...
 

Pièces jointes

  • Emetteur.xls
    70.5 KB · Affichages: 42
  • Emetteur.xls
    70.5 KB · Affichages: 33
  • Emetteur.xls
    70.5 KB · Affichages: 40

Bobman

XLDnaute Nouveau
Re : Archivage des lignes sélectionnées avec checkbox vers classeur

Je précise que je travail sur plusieurs tâche bien diverse donc ne m'en veux pas si j'ai mal compris ta demande. Tu m'as demandé un fichier exploitable avec longueur et largeur conforme à l'originale ce que j'ai fournis pour le fichier "Destinataire". La où j'ai fait une erreur c'est sur le tableau "Emetteur" puisqu'il faut décaler le tableau de 2 colonnes vers la droite pour que la forme du tableau concorde avec l'autre fichier. Le contenu du tableau débute bien à la ligne 3 (C:H) jusqu'à ligne xx. Pour ce qui est des noms des classeurs, je les ai expressément modifier par un nom plus explicite, d'où le changement soudain.
Donc j'avais crée la colonne "Select." dans le fichier "Emetteur" qui doit normalement contenir le checkbox. Mais si tu déclare que ce système est lourd je ne peux que t'écouter. Ce système n'est qu'un exemple mais si il existe un autre moyen de fonctionner plus performant alors c'est encore mieux ! Pour ce qui est de ton fichier ci-joint, le double clic est censé lancer la macro qui copie les lignes dans le fichier "Destinataire" ? Cela à l'avantage d'éviter la présence des colonne supplémentaires nommées "Sélect." et "sup". En revanche, le double clic à pour effet de mettre la date dans la cellule cible. Peut-on retirer cette correction automatique ? Donc je valide l'idée du double clic me semble plus instinctif pour l'utilisateur ;) Comment cela fonctionne pour le double clic ? Peut-on cliquer n'importe ou alors sur dans une colonne précise ?

Quant au fichier destinataire (qui avant s'appelait Classeur2.xls !), il contient des validation de données ???
Oui exactement, je pensais que tout était clair à ce sujet. Le fichier "Emetteur" doit copier les lignes sélectionnées (C:H) vers le "Destinataire" dont les lignes sont semblables (C:H).

Le fichier avec les colonnes décalées et code inchangé.
 

Pièces jointes

  • Copie de Emetteur.xls
    53 KB · Affichages: 48

Bobman

XLDnaute Nouveau
Re : Archivage des lignes sélectionnées avec checkbox vers classeur

Re, me voilà rentré du travail. J'ai examiné de pus prêt le code et je dois dire que l'histoire du double clic est ingénieux puis qu'il sélectionne ce qu'on lui demande (pl). Bizarrement de chez moi avec excel 2010 Pro lorsque je double clic sur une cellule je n'ai pas de problème de mise en date... alors qu'avec excel 2007 j'ai réellement un problème avec cette mise en forme automatique :mad: La ligne
Code:
Cancel = True 'évite le mode édition lié au double-clic
est-elle responsable de cela ?
Après 2 semaines je commence à cerner ton code mais j'ai encore beaucoup de mal concernant le IIf (l.18), car je n'ai jamais eu l'occasion de l'utiliser et même avec le commentaire je suis largué, à quoi sert-il exactement ?
Voila, j'ai donc essayé d'adapter le code pour que la sélection s'effectue sur les colonnes C:H mais maintenant le problème c'est que si je sélectionne la ligne 4, la sélection prend également la 3 etc...
Code:
dl = Cells(Application.Rows.Count, 3).End(xlUp).Row 'définit la dernière ligné éditée dl de la colonne 1 (=C)
Set pl = Range("C2:H" & dl) 'définit la plage pl de C à H
'si le double-clic a lieu ailleurs que dans la plage pl, sort de la procédure
If Application.Intersect(Target, pl) Is Nothing Then Exit Sub
Cancel = True 'évite le mode édition lié au double-clic
On Error Resume Next 'gestion des erreurs (si une erreur est provoquée, passe à la ligne suivante
nb = pls.Cells.Count 'définit le nombre de cellules de la plage pls (provoque une erreur si la plage pls n'est pas définie)
If Err <> 0 Then 'condition : si une erreur a été générée
    Err = 0 'annule l'erreur
    Set pls = Range("C1") 'définit la plage de départ pls (provisoire)
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
'définit la plage pls (si nb=1, la ligne de la cellule double-cliquée, sinon la plge pls +  la ligne de la cellule double-cliquée)
Set pls = IIf(pls.Cells.Count = 1, Range(Cells(Target.Row, 1), Cells(Target.Row, 6)), _
    Application.Union(pls, Range(Cells(Target.Row, 1), Cells(Target.Row, 6))))
pls.Select 'sélectionne la plage pls
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 964
Messages
2 094 008
Membres
105 912
dernier inscrit
willou3869