XL 2010 Récupérer selection d'une ListBox

Monster93

XLDnaute Nouveau
Bonjour,

Je m'initie à la programmation VBA alors j'ai créé une petite macro qui copie la feuille d'un classeur fermé et la colle dans autre classeur ouvert( où est exécuter la macro). Jusqu'ici tout va bien et tout marche bien.
Voilà où commence les problèmes, je voulu améliorer cette macro en affichant une fenêtre au debut qui permettrait de choisir quel feuille du classeur à copier.
Mon problème actuel est que je n'arrive pas à récupérer la sélection de la ListBox pour ainsi la stocker dans une variable.
Quelqu'un peut-il m'aider ?

Voici ma macro
VB:
Public Sub MiseàJour()
   
    'Prépare 2 objets
    Dim ClasseurFerme As Object
    Dim FeuilleFermee As Object
    Dim nom_feuilleFermee As String
    Dim ws As Worksheet
   
   
   
    'Affecte le classeur à l'objet
    Set ClasseurFerme = GetObject("F:\TAFF du 04_12_2017\Recurring info.xlsx")
    UserForm1.Show

   
    Do While rep_ok = False
   
    nom_feuilleFerme = ListBox1.SelectedItem.ToString()
   
    'Parcours l'ensemble des feuilles du classeur
    For Each ws In ClasseurFerme.Worksheets
        If ws.Name = nom_feuilleFerme Then
            Set FeuilleFermee = ws
            rep_ok = True
        End If
    Next
    If rep_ok = False Then
        MsgBox "Nom de feuille introuvable", vbInformation, "Oupss!"
    End If
    Loop
    'puis la feuille
    'Set FeuilleFermee = ClasseurFerme.Worksheets("nom_feuilleFerme")
   
    'Copie une plage
    FeuilleFermee.Range("A2:AA500").Copy
   
    'et la colle dans la feuille active (Classeur contenant la macro)
    ActiveSheet.Range("A2:AA500").Select
    ActiveSheet.Paste

    'Libère les variables
    Set FeuilleFermee = Nothing
    Set ClasseurFerme = Nothing

End Sub

Voici mon le code mon Userform
VB:
Private Sub UserForm_Initialize()
With Me.ListBox1
    .AddItem "Table Operateurs"
    .AddItem "Country"
    .AddItem "Operateur Simplifie"
    .AddItem "Bioss Rate Plan"
    .AddItem "Table OPE Interco DF"
    End With
End Sub



 
Private Sub OKButton_Click()
    Dim SelectedItems As String
    Dim i As Integer
   
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) = True Then
           SelectedItems = SelectedItems & ListBox1.List(i) & vbNewLine
    End If
    Next i

    If SelectedItems = "" Then
         MsgBox "Nothing selected"
    Else
         MsgBox "Selected Items: " & vbNewLine & SelectedItems
    End If
   
    Unload UserForm1
End Sub
 

Pièces jointes

  • macro_final - Copie.xlsm
    31.7 KB · Affichages: 72

Monster93

XLDnaute Nouveau
Bonjour Sousou,

Ta solution m'a un peu debuggé, car maintenant lorsque je sélectionne une ligne et que je valide. Il y a ma fenetre qui s'affiche et qui me dit que la feuille est introuvable alors qu'elle est bien présente. Et puis juste après j'ai l'erreur d'execution "91" Variable objet ou Variable de bloc With non défini

Merci de m'aider
 

Monster93

XLDnaute Nouveau
Bonjour Sousou,

Voici les deux fichiers
"Recurring info" est le classeur fermé où je veux copier une feuille pour la dans le classeur où la macro est exécuter. Mais maintenant lorsque je veux récuperer la selection de la listBox afin de la stocker dans la variable nom_feuilleFerme pour ensuite comparer ça ne focntionne pas

Cordialement,
 

Pièces jointes

  • Recurring info.xlsx
    13.8 KB · Affichages: 68
  • Copie de macro_final - Copie.xlsm
    25.8 KB · Affichages: 80

Monster93

XLDnaute Nouveau
reBonjour Sousou,

J'ai une autre demande à te soumettre, en effet j'ai voulu améliorer mon code. En effet je souhaiterais que ma macro sélectionne automatiquement toute la partie à copier ( de la cellule A2 jusqu'à la dernière cellule non vide). J'utilise donc UsedRange.SpecialCells(xlCellTypeLastCell) mais cela ne fonctionne pas
Voici le code :

VB:
Public Sub MiseàJour()
   
    'Declaration
    Dim ClasseurFerme As Object
    Dim FeuilleFermee As Object
    Dim nom_feuilleFermee As String
    Dim ws As Worksheet
    Dim r As Range
   
   
    'Affecte le classeur à l'objet
    Set ClasseurFerme = GetObject("T:\RIA\Analyse de marché\Recurring info.xlsx")
    UserForm1.Show

    nom_feuilleFerme = UserForm1.ListBox1.Value
   
    'Parcours l'ensemble des feuilles du classeur
    For Each ws In ClasseurFerme.Worksheets
        If ws.Name = nom_feuilleFerme Then
            Set FeuilleFermee = ws
            rep_ok = True
           
           
            Set r = FeuilleFermee.UsedRange.SpecialCells(xlCellTypeLastCell)
            Debug.Print r.Address
 

           ' Copie une plage
           FeuilleFermee.Range("A2:r").Copy
       

   
            'et la colle dans la feuille active (Classeur contenant la macro)
            ActiveSheet.Range("A2:r").Select
            ActiveSheet.Paste
        End If
    Next
    If rep_ok = False Then
        MsgBox "Vous n'avez sélectionner aucune feuille, à bientôt !", vbInformation, "Oupss !"
    End If

    'Libère les variables
    Set FeuilleFermee = Nothing
    Set ClasseurFerme = Nothing

End Sub
 

sousou

XLDnaute Barbatruc
Bonjour
Pour t'aider à simplifier tes codes, tu trouveras ci-joint un fichier que j'ai remanié.
Tu verras qu'il ne reste plus beaucoup de lignes.
Pense à choisir si tu veux insèrer les données, ou les copier
Si j'ai compris je pense que c'est une insertion dont tu as besoin
 

Pièces jointes

  • macro_final.xlsm
    32.6 KB · Affichages: 133

Monster93

XLDnaute Nouveau
Bonjour Sousou,

J'ai un peu remanié ton code, vu qu'il ne faisait pas totalement ce que je désire faire, mais je me retrouve encore avec une erreur :
VB:
  FeuilleFermee.UsedRange.Copy ActiveSheet.Range("A2") 'Copie toute les cellule de la cellule a partir de la ligne A2
            'et la colle dans la feuille active (Classeur contenant la macro)
            ActiveSheet.Range("A2:IV65536").Select 'Selectionne une plage
           ActiveSheet.Paste
Je me retrouve avec une erreur à ActiveSheet.Past alors que tout me semble correct

l'erreur : La methode paste de la classe worksheet à échoué
 
Dernière édition:

sousou

XLDnaute Barbatruc
Dans ta formule tu copies usedrange, donc toutes les valeur de la feuille y compris le header
Si tu ne veux pas de la première ligne, voici un petit test qui te permettra de corriger
utilisation de la propriété end
range(cells(2,1),cells(dernièreligne,dernièrecolonne)
Zone représentant les cellule à copier.
Sub test()
With Workbooks("Recurring info.xlsx").Sheets("feuil5")
Set zone= .Range(.Cells(2, 1), .Cells(.UsedRange.Columns(1).End(xlDown).Row, .UsedRange.Rows(2).End(xlToRight).Column))
MsgBox zone.Address
End With
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
315 090
Messages
2 116 107
Membres
112 661
dernier inscrit
ceucri