2016-09-05 7 views
0

Ich habe eine Excel-Datei und was ich getan habe ist, dass ich jede Spaltenüberschrift der Listbox als Elemente hinzufügen. Nun, was ich erreichen möchte, ist, wenn ich mehrere Elemente in Listbox wähle, wird es die entsprechende Spalte kopieren und in eine andere Arbeitsmappe einfügen.VBA MACRO - Dynamisch Spalten in Excel mit ListBox

Ich habe diesen Code gerade, er kann nur die erste Spalte kopieren und einfügen, die ich aus der Listbox auswählte. Ich hoffe, jemand könnte mir helfen.

Private Sub CommandButton1_Click() ' generate result 

Dim wkb As Workbook 
Dim rng As Range 
Dim cl As Object 
Dim strMatch As String 
Dim Size As Integer 
Dim lRow As Long, lCol As Long 
Dim rng1 As Range 
Dim rng2 As Range 
Dim rng3 As Range 

Set rng1 = Cells.Find("*", [a1], xlFormulas, , xlByRows, xlPrevious) 
Set rng2 = Cells.Find("*", [a1], xlFormulas, , xlByColumns, xlPrevious) 
Set rng3 = Range([a1], Cells(rng1.Row, rng2.Column)) 

strMatch = ListBox2.List(0) 'Copying Respondent Number 
Set rng = Range("A1:Z1") 
For Each cl In rng 
    If cl.Value = strMatch Then 
     cl.EntireColumn.Copy 'Copy Selected Column 
     Set wkb = Workbooks.Add 'Adding New Workbook 
     ActiveSheet.Paste 'Paste Selected Column 
     Exit For 
    End If 
Next cl 

End Sub 
+1

von Ihrer Beschreibung könnte versuchen, Ihre Listbox List des worksheet.columns (Index) –

+0

Ja @Nathan_Sav in Korrelation sein, dass ich richtig s. – alejandraux

+0

das war ein Hinweis, keine Notwendigkeit zum Suchen usw., verwenden Sie einfach die Indizes, um die Spalten zu erstellen, die Sie kopieren möchten. –

Antwort

0

Sie diesen

Option Explicit 

Private Sub CommandButton1_Click() 
    Dim i As Long 
    Dim colsIndexStrng As String 
    Dim copyRng As Range 

    With Me.ListBox2 
     For i = 0 To .ListCount - 1 
      If .selected(i) Then colsIndexStrng = colsIndexStrng & Cells(1, i + 1).Address(False, False) & "," 
     Next i 
    End With 

    If colsIndexStrng = "" Then Exit Sub 

    Set copyRng = Range(Left(colsIndexStrng, Len(colsIndexStrng) - 1)).EntireColumn 
    With Workbooks.Add 
     copyRng.Copy ActiveSheet.Range("A1") 
    End With 
    ActiveWorkbook.Close True 
End Sub 
+0

Sie sind willkommen. dann bitte die Antwort als akzeptiert markieren. danke – user3598756

+0

Danke für Ihre heIp. Ich habe gerade jetzt beobachtet. Dieser Code funktioniert einwandfrei, kopiert jedoch nicht die Spalten, die ich aus der Listbox ausgewählt habe. Ich hoffe, Sie können mir helfen, eine Möglichkeit zu finden, die Spalten zu kopieren, die den in der Listbox ausgewählten Elementen entsprechen. Vielen Dank ! – alejandraux

+0

Es tut mir leid mein Fehler. Es funktioniert schon. Ich ändere einfach meinen Listenstil und es funktioniert schon ganz gut zu mir. Danke für deine großartige Hilfe! Du sparst wirklich den Tag! – alejandraux

0

vorgeschlagene Korrektur. Dies erstellt 1 Arbeitsmappe pro ausgewählter Spalte.

Private Sub CommandButton1_Click() ' generate result 
Dim rng As Range 
Dim cl As Object 
Dim strMatch As String 
Dim , i As Integer 
Dim lCol As Long 
lCol = Cells(1, Columns.Count).End(xlToLeft).Column 
For i = 0 To ListBox1.ListCount - 1 
strMatch = ListBox1.List(i) 'Copying Respondent Number 
Set rng = Range(Cells(1, 1), Cells(1, lCol)) 
Set cl = rng.Find(strMatch, lookat:=xlWhole) 
If Not cl Is Nothing Then 
     cl.EntireColumn.Copy 'Copy Selected Column 
     Set wkb = Workbooks.Add 'Adding New Workbook 
     ActiveSheet.Paste 'Paste Selected Column 
End If 
Next i 
End Sub 
+0

Ich habe diesen Code ausprobiert, aber ich bekomme einen Fehler mit dem Hinweis "object required". Wie auch immer, danke für die Hilfe – alejandraux

+0

@alejandraux Ich habe einige Korrekturen vorgenommen – h2so4