(resolu)envoyer lignes de listbox dans classeurs sur C:merci lone-wolf et si...

grisan29

XLDnaute Accro
bonjour a tous et toutes
je cherche a faire un peu comme un carnet de commandes mais avec un classeur exel, avec un userform et une listbox ,mais c'est la que ça vas plus car je ne sais comment envoyer les lignes sélectionnées dans le classeur qui est déterminer par le choix du combobox , de plus ces classeurs au nom de fournisseurs se trouvent dans un dossier sur C:\fournisseurs
comme mon explication n'est peut être pas clair, je vous joints des exempes
le dossier"fournisseurs" est mettre sous C: et le test commande listbox est le classeur test

j'ai mis un code qui envoie correctement les lignes sur la feuille
il vaux mieux que je donne plus d'explication
donc quand l'userform s'initialise la listbox se charge du contenu de la feuille et comme un devis ne concerne pas qu'un seul fournisseurs, je sélectionne les lignes correspond a tel fournisseurs
et je voudrais pouvoir désélectionnée les lignes après dès l'appui sur le bouton "transfert" qui lui envoie les lignes sélectionnées dans la feuille choisi dans la combobox, afin de continuer les commandes

merci par avance a celui que ça tente
 

Pièces jointes

  • test fournisseurs.zip
    98.5 KB · Affichages: 48
Dernière édition:

grisan29

XLDnaute Accro
bonjour Si.... lone-wolf et le forum
merci de ta réponse si... mais j'ai appelé le post "
envoyer lignes de listbox dans classeurs sur C:
ton classeur lui contient toutes les feuilles, si je déplace les feuilles sous c: il n'y plus de commandes pour envoyer les lignes sélectionnées


si.... c'est une méprise si j'ai écrit ceci
j'ai mis un code qui envoie correctement les lignes sur la feuille
oui c'est sur la feuille parce que je ne savais pas le faire pour que les lignes aillent dans le classeur adéquate sur c:

et l'exemple mis dans le post 2 envoie le paquet de lignes dans le classeur sur c: et pas les lignes sélectionnées
mais surtout pas supprimées les lignes sur le classeur source
 
Dernière édition:

Si...

XLDnaute Barbatruc
re
bonjour Si.... lone-wolf et le forum
merci de ta réponse si... mais j'ai appelé le post "
envoyer lignes de listbox dans classeurs sur C:


cool, ne crie pas comme ça :(. Ce n'est pas une méprise mais un exemple correspondant au message cité.

J'ai créé les onglets pour te montrer comment on pouvait transmettre la sélection (je n’ai pas dit de les utiliser pour envoyer les informations).

Lone wolf ;) d’ailleurs t’a proposé des méthodes, non ? Utilise-les.
 

grisan29

XLDnaute Accro
bonsoir si....
j'ai pris une partie du code que propose Lone-wolf dans le post 4 et cela ne fonctionne pas comme je ne veux tout comme les autres réponses
je n'ai pas l'intention de crier après quelqu'un, je cherche quelque chose que je sais pas faire
voici comment j'ai adapter le code lone-wolf, mais qui envoie les lignes choisies que dans certains classeur je dits certains car je fait le test chez tous pour l'instant
j'essaye cela car on est dans un monde numérique et certains fournisseurs m'ont demander de le faire par internet

Code:
    Option Explicit
    Sub ChargementListBox1()
        'nettoyage
        ListBox1.Clear

                With ListBox1
                    'source des données sur le feuille
                    .RowSource = "D19:G235"
                    'affichage entête colonne
                    .ColumnHeads = True 'False 'où true
                    'nombre de colonne
                    .ColumnCount = 5
                    'largeur de la colonne
                    .ColumnWidths = "150;54;50;50;50"
                End With

        End Sub

Private Sub CommandButton1_Click()


'copie les lignes selectionnées dans la colonne G
    Dim i As Integer
    Dim rg As Range
    Dim Fichier As Workbook
    Dim Chemin As String
'Call hautpage
    Chemin = commande.CBlistefournisseurs
    Application.ScreenUpdating = False
    On Error Resume Next
    Set Fichier = Workbooks.Open("C:\Facturation\base\fournisseurs\" & Chemin)

    With Workbooks(Chemin)
        'on boucle sur tous les éléments du Listview
       For i = 1 To commande.ListBox1.ListCount 'commande.LVchoixarticles.ListItems.Count
        'et on copie uniquement les items sélectionnées
      
          If ListBox1.Selected(i) = True Then .Sheets(1).Range("B65536").End(xlUp).Offset(1, 0) = ListBox1.List(i, 0)
          If ListBox1.Selected(i) = True Then .Sheets(1).Range("C65536").End(xlUp).Offset(0, 1) = ListBox1.List(i, 2)
          If ListBox1.Selected(i) = True Then .Sheets(1).Range("D65536").End(xlUp).Offset(0, 2) = ListBox1.List(i, 4)
    
    Next i
       .Close (1)
    End With
  
     Application.ScreenUpdating = True
End Sub

    Private Sub UserForm_Activate()
        'activation du chargement de la listbox
        Call ChargementListBox1
        End Sub



    Private Sub UserForm_Initialize()
   Dim fournisseur As Variant, i As Integer
  

fournisseur = Array("Rouenel", "Rexel", "Tanguy", "Leader Mat", _
                    "Queguiner", "Pointp", "Dispano", "Cedeo", "Kerbrat", "Qama", _
                    "Foussier", "Wurth")
    For i = 0 To UBound(fournisseur)
        CBlistefournisseurs.AddItem fournisseur(i)
    Next i
'CBlistefournisseurs.ListIndex = 0
    End Sub

voici le code complet où j'ai pris soin que les noms de fournisseurs soit identiques
 
Dernière édition:

grisan29

XLDnaute Accro
bonsoir a tous
voici le classeur et les classeurs fournisseurs qui sont dans un dossier du même nom
j'ai fait plusieurs test chaque c'est pareil quelques fournisseurs n'ont pas reçu leur commandes alors que tous l'un après l'autre devrai le recevoir
et c'est que le code de Lone-wolf bloque , et son 2ème et 3ème opus n'envoie qu'une colonne même bien tout parametrer et pas a tous
c'est sur après dans le bon classeur suivant le devis fait je n'aurais pas besoin de tous les fournisseurs c'est pour cela la sélection dans la listbox

j'ai bien un classeur qui le fait mais il est a bases de listvew qui ne se transporte pas
 

Pièces jointes

  • testlistbox.zip
    96.4 KB · Affichages: 51

grisan29

XLDnaute Accro
bonsoir si...
merci pour ton fichier, je l'essaye avec tout les fournisseurs l'un après l'autre et au dernier boum crash d'excel écran vide plus rien
bon je recommence et un par un aller sans au bout, je vais sur c: voir si le transfert ce fait et classeur vide
je recommence et pareil classeur vide
je refait un test avec tous les fournisseurs boum crash d'excel

ah oui quand ca ira mon classeur a une entête qu'il ne faudra pas que la listbox la charge
c'est pour cela que les articles sont mis a partir de la ligne 19
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re à tous

Pascal, je ne sais pas si sa peux t'aider. J'ai modifié la macro pour l'ouverture des fichiers, il manquait l'extention ".xlsx".

VB:
Option Explicit
Dim Fichier As String, Nom As String, Chemin As String
Dim Wks As Workbook, Sh As Worksheet
'---------------------------------------------------------
Sub Ouvrir_Fichier()
    Nom = CBlistefournisseurs.Text
    Fichier = Nom & ".xlsx"
    Chemin = ThisWorkbook.Path & "\fournisseurs\"
    Set Wks = Workbooks.Open(Chemin & Fichier)
End Sub

Private Sub CBlistefournisseurs_Change()
If CBlistefournisseurs <> "" Then Ouvrir_Fichier
End Sub

Private Sub CommandButton1_Click()
  Dim L As Long, n As Long, i As Long, Fichier

  L = ListBox1.ListIndex
  If L < 1 Then MsgBox "vous n'avez rien sélectionné", 16, "oups...": Exit Sub
  n = ListBox1.ListCount
  Application.ScreenUpdating = False
  On Error Resume Next
  Set Sh = ActiveWorkbook.ActiveSheet

  With Sh
  L = .Cells(8, 2).End(xlUp)
  For i = 0 To n - 1
  If ListBox1.Selected(i) Then
  L = L + 1
  .Cells(L, 2) = ListBox1.List(i)
  .Cells(L, 3) = ListBox1.List(i, 1)
  .Cells(L, 4) = ListBox1.List(i, 3)
  End If
  Next
  ActiveWorkbook.Save
  End With
  Application.DisplayAlerts = 0
  ActiveWorkbook.Close False
  Application.DisplayAlerts = 1
  ListBox1.MultiSelect = 0: ListBox1.MultiSelect = 1
End Sub
 
Dernière édition:

grisan29

XLDnaute Accro
bonsoir
je viens de voir que tu as modifier ton code
j'ai changer le chemin dans la sub ouvrir_fichier comme ceci
Code:
Sub Ouvrir_Fichier()
    Nom = CBlistefournisseurs.Text
    Fichier = Nom & ".xlsx"
     'Chemin = ThisWorkbook.Path & "\fournisseurs\"
   Chemin = "C:\Facturation\base" & "\fournisseurs\"
    Set Wks = Workbooks.Open(Chemin & Fichier)
End Sub

et je n'ai rien d'afficher dans la listbox
bon c'est parce que j'avais tout virer pour mettre ton code
maintenant la feuille du fournisseur s'ouvre en avant et quand je rouvre l'autre classeur et que j'envoi rien ne se passe
 
Dernière édition:

grisan29

XLDnaute Accro
bonsoir
tout compte fait ce n'est pas un crash d'excel mais une fermeture brutale avec cette ligne
Code:
 'ActiveWorkbook.Close False
maintenant l'envoi des lignes se fait dans le classeur source et non dans un des classeurs sur c:
voila tout le code tel que je l'ai mis

Code:
Option Explicit
Dim Fichier As String, Nom As String, Chemin As String
Dim Wks As Workbook, Sh As Worksheet
'---------------------------------------------------------
Sub Ouvrir_Fichier()
    Nom = CBlistefournisseurs.Text
    Fichier = Nom & ".xlsx"
   ' Chemin = ThisWorkbook.Path & "\fournisseurs\"
    Chemin = "C:\Facturation\base\fournisseurs\"
    'Set Wks = Workbooks.Open(Chemin & Fichier)
End Sub

Private Sub CBlistefournisseurs_Change()
If CBlistefournisseurs <> "" Then Ouvrir_Fichier
End Sub

Private Sub CommandButton1_Click()
  Dim L As Long, n As Long, i As Long, Fichier

  L = ListBox1.ListIndex
  If L < 1 Then MsgBox "vous n'avez rien sélectionné", 16, "oups...": Exit Sub
  n = ListBox1.ListCount
  Application.ScreenUpdating = False
  On Error Resume Next
  Set Sh = ActiveWorkbook.ActiveSheet

  With Sh
  L = .Cells(8, 2).End(xlUp)
  For i = 0 To n - 1
  If ListBox1.Selected(i) Then
  L = L + 1
  .Cells(L, 2) = ListBox1.List(i)
  .Cells(L, 3) = ListBox1.List(i, 1)
  .Cells(L, 4) = ListBox1.List(i, 3)
  End If
  Next
  ActiveWorkbook.Save
  End With
  Application.DisplayAlerts = 0
  'ActiveWorkbook.Close False
  Application.DisplayAlerts = 1
  ListBox1.MultiSelect = 0: ListBox1.MultiSelect = 1
End Sub

   
    Sub ChargementListBox1()
        'nettoyage
        ListBox1.Clear

                With ListBox1
                    'source des données sur le feuille
                    .RowSource = "D19:G235"
                    'affichage entête colonne
                    .ColumnHeads = False 'False 'où true
                    'nombre de colonne
                    .ColumnCount = 5
                    'largeur de la colonne
                    .ColumnWidths = "150;54;50;50;50"
                End With

        End Sub

'Private Sub CommandButton1_Click()


'copie les lignes selectionnées dans la colonne G
   ' Dim i As Integer
    'Dim rg As Range
    'Dim Fichier As Workbook
    'Dim Chemin As String
'Call hautpage
   ' Chemin = commande.CBlistefournisseurs
    'Application.ScreenUpdating = False
   ' On Error Resume Next
   ' Set Fichier = Workbooks.Open("C:\Facturation\base\fournisseurs\" & Chemin)

    'With Workbooks(Chemin)
        'on boucle sur tous les éléments du Listview
       'For i = 1 To commande.ListBox1.ListCount 'commande.LVchoixarticles.ListItems.Count
        'et on copie uniquement les items sélectionnées
      
         ' If ListBox1.Selected(i) = True Then .Sheets(1).Range("B65536").End(xlUp).Offset(1, 0) = ListBox1.List(i, 0)
         ' If ListBox1.Selected(i) = True Then .Sheets(1).Range("C65536").End(xlUp).Offset(0, 1) = ListBox1.List(i, 2)
         ' If ListBox1.Selected(i) = True Then .Sheets(1).Range("D65536").End(xlUp).Offset(0, 2) = ListBox1.List(i, 4)
    
    'Next i
    '   .Close (1)
   ' End With
  
    ' Application.ScreenUpdating = True
'End Sub

    Private Sub UserForm_Activate()
        'activation du chargement de la listbox
        Call ChargementListBox1
        End Sub



    Private Sub UserForm_Initialize()
   Dim fournisseur As Variant, i As Integer
  

fournisseur = Array("Rouenel", "Rexel", "Tanguy", "Leadermat", _
                    "Queguiner", "Pointp", "Dispano", "Cedeo", "Kerbrat", "Qama", _
                    "Foussier", "Wurth")
    For i = 0 To UBound(fournisseur)
        CBlistefournisseurs.AddItem fournisseur(i)
    Next i
'CBlistefournisseurs.ListIndex = 0
    End Sub
 

Pièces jointes

  • visu sauvegarde.jpg
    visu sauvegarde.jpg
    196.4 KB · Affichages: 37

Lone-wolf

XLDnaute Barbatruc
Re Pascal

Mais... Tu veux afficher combien de classeurs à la fois??? :eek:

Sinon, chez moi pour inscrire les lignes à partir de la ligne 8. Dans la macro workbook.open, tu peux mettre ceci
Application.WindowState = xlMinimized

VB:
Private Sub CommandButton1_Click()
  Dim L As Long, n As Long, i As Long, Fichier


  L = ListBox1.ListIndex
  If L < 1 Then MsgBox "vous n'avez rien sélectionné", 16, "oups...": Exit Sub
  n = ListBox1.ListCount
  Application.ScreenUpdating = False
  On Error Resume Next
  Set Sh = ActiveWorkbook.ActiveSheet

  With Sh
    L = .Cells(1, 2).End(xlUp) - 1 '=ligne 8
    For i = 0 To n - 1
      If ListBox1.Selected(i) Then
        .Cells(L - 1, 2) = ListBox1.List(i)
        .Cells(L - 1, 3) = ListBox1.List(i, 1)
        .Cells(L - 1, 4) = ListBox1.List(i, 3)
            L = L + 1
       End If
     Next
  End With
  Unload Me
  Application.DisplayAlerts = False
  ActiveWorkbook.Close True
End Sub
 

grisan29

XLDnaute Accro
bonsoir Lone-wolf
j'abandonne ça écrit toujours sur la feuille source et non dans dans c:
je vais essayer d'autres choses moins dure a oser
Mais... Tu veux afficher combien de classeurs à la fois???
aucun les remplir sur c:
 
Dernière édition:

Discussions similaires

Réponses
25
Affichages
651
Réponses
18
Affichages
621

Statistiques des forums

Discussions
312 195
Messages
2 086 076
Membres
103 111
dernier inscrit
Eric68350