Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1936to1940
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Multi Select

Multi Select
24.07.2023 11:54:19
Chrisi
Hallo Zusammen,

habe eig nur ein simples Problem, stehe aber trotzdem an mit meinem Grundlegenden VBA-Kenntnissen.

habe ein Programm geschrieben welches (bis jetzt) ein File einliest und dieses dann weiter verarbeitet, nun soll aber nicht nur ein File aufeinmal eingelesen werden können, sondern so viele wie man will (aufeinmal).

Ich weiß aber nicht wie man einen Multiselect macht und da ich meinen Code schon auf den Singleselect getrimmt habe, finde ich keine passenden Beispiele im Internet dafür.

Hoffe mir kann jemand helfen, folgend der VBA-Code:

Sub Unproduktivität()

Application.ScreenUpdating = False
Application.DisplayAlerts = False


'Variablen
Dim strFile As Variant
Dim geöffneteDatei As Workbook
Dim erste_freie_Zeile As Long
Dim zeile As Long
Dim Ende As Long
Dim LRow As Integer
Dim Kalenderjahr As String
Kalenderjahr = "/23"
Dim wksWeek As Worksheet
Dim wksAll As Worksheet
Dim dtCurrent As Date, dtMonday As Date, dtRow As Date
Dim lngRowLastEntry As Long, lngRowMonday As Long
Dim lngFirstCol As Long, lngLastCol As Long
Dim i As Long

Worksheets("Daten_pro_Woche").Activate
Range("A1:F30").Select
Selection.Delete

Worksheets("Zwischenablage").Activate
Range("A1:R300").Select
Selection.Delete

'Datei auswahl
strFile = Application.GetOpenFilename
Set geöffneteDatei = Workbooks.Open(Filename:=strFile)




'Überschreiben von Datenbank File auf Excel Datei
Set geöffneteDatei = ActiveWorkbook



'Datenimport & entfernen von header leerzeile
Range("A1:R300").Copy
ThisWorkbook.Activate
Sheets("Zwischenablage").Activate
Range("A1").Select
ActiveSheet.Paste
Range("A1").Select
Ende = Range("A3").End(xlDown).Row
Do Until i = Ende
If ActiveCell.Value = "" Then
ActiveCell.EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Select
End If
i = i + 1
Loop


geöffneteDatei.Close

ThisWorkbook.Activate


' spaltenKopieren
Worksheets("Zwischenablage").Activate
Columns("A:A").Select
Selection.NumberFormat = "m/d/yyyy"
Range("A1:A150,E1:E150,G1:G150,L1:L150,N1:N150,O1:O150").Select
Selection.Copy
Sheets("Alle_Daten").Activate
Range("A1").Select
If ActiveCell = "" Then
ActiveSheet.Paste
Else
'freie Zeile suchen für Kopie in Alle_Daten
erste_freie_Zeile = Cells(Rows.Count, 1).End(xlUp).Row
Cells(erste_freie_Zeile + 1, 1).Select
ActiveSheet.Paste
For zeile = Range("A65536").End(xlUp).Row To 2 Step -1
If Cells(zeile, 1).Interior.ColorIndex = 6 Then
Rows(zeile).Delete
End If
Next zeile
End If


'kalenderwoche einfügen
Sheets("Alle_Daten").Select
Range("G1").Select
ActiveCell.Value = "Kalenderwoche"
Range("G1").Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
Selection.Font.Bold = True
End With
Columns("A:G").Select
Selection.EntireColumn.AutoFit

Range("G2").Select
LRow = Cells(Rows.Count, 1).End(xlUp).Row
ActiveCell.FormulaR1C1 = "=WEEKNUM(RC[-6],21)"
'=TEXT(KÜRZEN((A2-DATUM(JAHR(A2+3-REST(A2-2;7));1;REST(A2-2;7)-9))/7);"00")&"/"&TEXT(A2;"JJ")
Range("G2").AutoFill Destination:=Range("G2:G" & LRow), Type:=xlFillDefault




Set wksAll = ThisWorkbook.Worksheets("Alle_Daten")
Set wksWeek = ThisWorkbook.Worksheets("Daten_pro_Woche")
lngFirstCol = 1
lngLastCol = 7


lngRowLastEntry = wksAll.Cells(Rows.Count, lngFirstCol).End(xlUp).Row
'Letztes Datum in der ersten Spalte
dtCurrent = CDate(Int(wksAll.Cells(lngRowLastEntry, lngFirstCol).Value))
'Montag dieser Woche
dtMonday = DateAdd("d", -((Weekday(dtCurrent) + 5) Mod 7), dtCurrent)

' Zeile suchen, die vor dem Montag der Woche liegt
i = lngRowLastEntry
Do
i = i - 1
dtRow = wksAll.Cells(i, lngFirstCol).Value
Loop Until dtRow dtMonday And i > 2

' erste zu kopierende Zeile
lngRowMonday = i + 1

' Wochendaten löschen
wksWeek.usedRange.ClearContents
' Wochendaten neu kopieren
wksAll.Range(Cells(lngRowMonday, lngFirstCol).Address, Cells(lngRowLastEntry, lngLastCol).Address).Copy wksWeek.Range("A2")



'Headerzeile hinzufügen
Sheets("Alle_Daten").Activate
Range("A1:G1").Select
Selection.Copy
Sheets("Daten_pro_Woche").Activate
Range("A1").Select
ActiveSheet.Paste
Columns("A:G").Select
Selection.EntireColumn.AutoFit

'duplikate entfernen
Sheets("Alle_Daten").Select
Application.CutCopyMode = False
Columns("A:G").Select
ActiveSheet.Range("$A$1:$G$250000").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7), Header:=xlYes

'refresh pivot
Sheets("Pivot_aktuelle_Woche").Select
ActiveSheet.ChartObjects("Diagramm 2").Activate
ActiveChart.PivotLayout.PivotTable.PivotCache.Refresh
Sheets("Pivot_gesamt").Select
ActiveSheet.ChartObjects("Diagramm 1").Activate
ActiveChart.PivotLayout.PivotTable.PivotCache.Refresh


Worksheets("Start").Activate
MsgBox ("Kopieren aller Daten erfolgreich beendet")

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Multi Select
24.07.2023 16:51:06
Piet
Hallo

ich denke ein wichtiger Schritt zum guten Code ist in diesem Makro auf alle Select zu verzichten. Und die Set Sheets noch vorne zu stellen.
Würde mich freuen wenn der Code so besser läuft, aber -Ohne Garantie- das ich alles richtig korrigiert habe. Konnte die Datei nicht testen!

mfg Piet

  • Sub Unproduktivität()
    'Variablen
    Dim strFile As Variant
    Dim geöffneteDatei As Workbook
    Dim erste_freie_Zeile As Long
    Dim zeile As Long, Ende As Long
    Dim LRow As Integer, i As Long
    Dim Kalenderjahr As String
    Dim wksZwAb As Worksheet
    Dim wksWeek As Worksheet
    Dim wksAll As Worksheet
    Dim dtCurrent As Date, dtMonday As Date, dtRow As Date
    Dim lngRowLastEntry As Long, lngRowMonday As Long
    Dim lngFirstCol As Long, lngLastCol As Long

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Kalenderjahr = "/23"

    Set wksAll = ThisWorkbook.Worksheets("Alle_Daten")
    Set wksWeek = ThisWorkbook.Worksheets("Daten_pro_Woche")
    Set wksZwAb = ThisWorkbook.Worksheets("Zwischenablage")

    wksWeek.Range("A1:F30").Delete
    wksZwAb.Range("A1:R300").Delete

    'Datei auswahl
    strFile = Application.GetOpenFilename
    Set geöffneteDatei = Workbooks.Open(Filename:=strFile)

    'Überschreiben von Datenbank File auf Excel Datei
    'Datenimport & entfernen von header leerzeile
    Range("A1:R300").Copy wksZwAb.Range("A1")

    '** löschen besser Rückwärts nach Null
    i = Cells(Rows.count, 1).End(xlUp).Row
    Do Until i = 0
    If Cells(i, 1).Value = "" Then _
    Cells(i, 1).EntireRow.Delete
    i = i - 1
    Loop

    geöffneteDatei.Close
    ThisWorkbook.Activate

    ' spaltenKopieren
    With wksZwAb
    If wksAll.Range("A1") = "" Then erste_freie_Zeile = 1 Else _
    erste_freie_Zeile = wksAll.Cells(Rows.count, 1).End(xlUp).Row + 1
    .Columns("A:A").NumberFormat = "m/d/yyyy"
    .Range("A1:A150,E1:E150,G1:G150,L1:L150,N1:N150,O1:O150").Copy _
    wksAll.Cells(erste_freie_Zeile, 1)
    End With
    'farbliche Zeilen löschen
    With wksAll
    For zeile = .Range("A65536").End(xlUp).Row To 2 Step -1
    If .Cells(zeile, 1).Interior.ColorIndex = 6 Then
    .Rows(zeile).Delete
    End If
    Next zeile
    End With

    'kalenderwoche einfügen
    With wksAll
    LRow = .Cells(Rows.count, 1).End(xlUp).Row
    .Range("G1").Value = "Kalenderwoche"
    .Range("G1").Font.Bold = True
    With .Range("G1").Interior
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
    .Color = 65535
    .TintAndShade = 0
    .PatternTintAndShade = 0
    End With
    .Columns("A:G").EntireColumn.AutoFit
    .Range("G2").FormulaR1C1 = "=WEEKNUM(RC[-6],21)"
    '=TEXT(KÜRZEN((A2-DATUM(JAHR(A2+3-REST(A2-2;7));1;REST(A2-2;7)-9))/7);"00")&"/"&TEXT(A2;"JJ")
    .Range("G2").AutoFill Destination:=.Range("G2:G" & LRow), Type:=xlFillDefault
    End With

    lngFirstCol = 1
    lngLastCol = 7

    lngRowLastEntry = wksAll.Cells(Rows.count, lngFirstCol).End(xlUp).Row
    'Letztes Datum in der ersten Spalte
    dtCurrent = CDate(Int(wksAll.Cells(lngRowLastEntry, lngFirstCol)))
    'Montag dieser Woche
    dtMonday = DateAdd("d", -((Weekday(dtCurrent) + 5) Mod 7), dtCurrent)

    ' Zeile suchen, die vor dem Montag der Woche liegt
    i = lngRowLastEntry
    Do
    i = i - 1
    dtRow = wksAll.Cells(i, lngFirstCol).Value
    Loop Until dtRow dtMonday And i > 2

    ' erste zu kopierende Zeile
    lngRowMonday = i + 1

    ' Wochendaten löschen
    wksWeek.UsedRange.ClearContents
    ' Wochendaten neu kopieren
    wksAll.Range(Cells(lngRowMonday, lngFirstCol), Cells(lngRowLastEntry, lngLastCol)).Copy wksWeek.Range("A2")

    'Headerzeile hinzufügen
    wksAll.Range("A1:G1").Copy wksWeek.Range("A1")
    wksWeek.Columns("A:G").AutoFit

    'duplikate entfernen
    Swksall.Range("$A$1:$G$250000").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7), Header:=xlYes

    'refresh pivot
    Sheets("Pivot_aktuelle_Woche").ChartObjects("Diagramm 2").PivotLayout.PivotTable.PivotCache.Refresh
    Sheets("Pivot_gesamt").ChartObjects("Diagramm 1").PivotLayout.PivotTable.PivotCache.Refresh

    Worksheets("Start").Activate
    MsgBox ("Kopieren aller Daten erfolgreich beendet")

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    End Sub
  • Anzeige
    AW: Multi Select
    24.07.2023 12:51:23
    Daniel
    Hi
    das für Multiselect umzuschreiben, geht eigentlich ganz einfach:

    zum einen kannst du bei GetOpenFilename das einfach zulassen:
    strFile = Application.GetOpenFilename(Multiselect:=True)

    die Aufnehmende Variable wird dann ein eindimensionales Array, welches die ausgewählten Dateinamen enthält.

    das Array kannst du dann mit einer Schleife durchlaufen, entweder als For-Each-Schleife:
    dim varFiles as Variant
    dim strFile as Variant

    varFiles = Application.GetOpenFilename(Multiselect:=True)
    if VarType(varFiles) = vbBoolean then Exit sub '--- Abbruch
    for each strFile in varFiles
    Set geöffneteDatei = Workbooks.Open(Filename:=strFile)
    ....
    und hier dann der weitere Code wie bisher
    ...
    next


    oder auch mit einer index-schleife:
    for i = Lbound(varFiles) to ubound(varFiles)
    Set geöffneteDatei = Workbooks.Open(Filename:=varFiles(i))
    ...
    Next


    gruß Daniel
    Anzeige
    AW: Multi Select
    24.07.2023 14:12:23
    Dima
    Danke funktioniert !
    AW: Multi Select
    24.07.2023 12:09:44
    Rudi Maintaire
    Hallo,
    Schema:
    Sub aaa()
    Dim si As Object, sii, wkb As Workbook
    With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = True
    If .Show Then
    Set si = .SelectedItems
    End If
    End With
    If Not si Is Nothing Then
    For Each sii In si
    Set wkb = Workbooks.Open(sii)
    'mach was
    wkb.Close False
    Next sii
    End If
    End Sub


    Gruß
    Rudi
    AW: Multi Select
    24.07.2023 12:04:51
    onur
    Im Prinzip so:
    https://www.herber.de/mailing/Aus_GetOpenFilename-Dialog_eine_Mehrfachauswahl_auslesen.htm
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige