Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1752to1756
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

Arrays aufrufen

Arrays aufrufen
22.04.2020 20:16:10
Sascha
Guten Abend Zusammen,
ich muss noch mal eine, vermutlich, blöde Frage stellen. Die Antwort könnte gleich zwei meiner Probleme lösen:
Wie in einem anderen Beitrag schon erwähnt, habe ich einen sehr komplexen Export aufzubereiten.
Ich erzeuge verschieden aufgebaute Tabellen und möchte über unterschiedliche Buttons ausgewählte Seiten in eine neue Arbeitsmappe
kopieren.
Mein Code adressiert bisher konkret ein oder mehrere Blätter die kopiert werden sollen. Natürlich könnte ich jetzt einfach für alle Arten Export eine
separate Funktion erzeugen, das würde ich aber gerne vermeiden, in dem ich in der Sub des Buttons beim Aufruf meiner Export-Funktion einfach die
zu exportierenden Seiten mitgebe. Nach meinem Verständnis müsste das mit einem Array gut gehen und tatsächlich klappt es in dem hier gezeigten speziellen
Fall auch.
Aber dieser Weg führt mich wieder an das Problem, dass es konkret ist und ich die Funktion so nicht mit anderen Übergabewerten aufrufen kann.

'Funktion zum Export der bereinigten CSV
Sub Export(ParamArray cpyStr())                            'Hier ist sicherlich etwas zu  _
korrigieren?
Worksheets(Array(cpyStr(0), cpyStr(1))).Copy    'und hier erst recht?
Dim Name
Name = Application.GetSaveAsFilename("", fileFilter:="Microsoft Excel-Arbeitsmappe (*.xlsx), _
*.xlsx", Title:="Speicherort und Dateiname wählen...")
If Name  False Then
ActiveWorkbook.SaveAs Name, FileFormat:= _
xlWorkbookDefault
End If
End Sub
Der Aufruf sieht für diesen Fall wie folgt aus und Funktioniert sogar:

Private Sub CommandButton3_Click()
Export "Ausgabe", "Quelle"
Das Problem ist jetzt nur, folgender Aufruf bspw. funktioniert (logischerweise) nicht:

Private Sub CommandButton9_Click()
Export "Partner1", "Partner2", "Partner3", "Partner4"
End Sub
Könnt Ihr mir sagen, wie ich dem Problem beikommen kann?
Ein ähnliches Problem habe ich mit einer Prozedur, die vorher über jedes Blatt laufen soll. Auch hier würde ich gerne ein mehrfaches Deklarieren der Subs vermeiden und über Arrays im Aufruf die Prozedur mehrfach ablaufen lassen. Erschwerend hin zu kommt, dass für jedes Blatt auf das die Prozedur angewendet wird eine Eingabe (Datum) durch den Nutzer erfolgen muss (allerdings für alle Blätter immer gleich).

Sub GruppierenEinzeln(sheet As String) 'gleiches Problem wie bei der Export Prozedur?
With ActiveWorkbook.Sheets(sheet)
Dim i As Integer
Dim dateVal As Date
Dim LastRow As Long
Dim SumFaellig As Currency
Dim SumGes As Currency
SumFaellig = 0
SumGes = 0
LastRow = ActiveWorkbook.Worksheets(sheet).Cells(Rows.Count, "A").End(xlUp).Row
On Error Resume Next
dateVal = CDate(InputBox("Bitte ein gültiges Datum in der Form TT.MM.JJJJ eingeben:", "Fä _
lligkeitsdatum")) 'der Wert der für jedes Blatt gesetzt werden soll, auf das die Prozedur angewendet wird
On Error GoTo 0
.Cells.ClearOutline
Application.ScreenUpdating = False
For i = 2 To LastRow
If .Cells(i, 6) 
Ich hoffe ich konnte halbwegs verständlich vermitteln, wo es bei mir grad hängt!
Vorab danke ich euch für Tipps und Verbesserungsanstöße!
Liebe Grüße
Sascha

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

Betreff
Datum
Anwender
Anzeige
AW: Arrays aufrufen
23.04.2020 09:42:18
fcs
Hallo Sascha,
hier deine Makros angepasst, so dass es funktioniert.
Bei dem Bruppiermakro musst du die Eingabe des Datums ins Hauptmakro verlagern und das Datum als 2. Parameter des Untermakros übergeben.
Da einfacher zu handhaben wird das zu bearbeitende Blatt als Objekt übergeben und nicht der Name des Blattes.
LG
Franz
'Funktion zum Export der bereinigten CSV
Sub Export(arrSheets As Variant, Optional wkb As Workbook)
Dim Name
If wkb Is Nothing Then Set wkb = ActiveWorkbook
wkb.Sheets(arrSheets).Copy    'und hier erst recht?
Name = Application.GetSaveAsFilename("", _
fileFilter:="Microsoft Excel-Arbeitsmappe (*.xlsx), *.xlsx", _
Title:="Speicherort und Dateiname wählen...")
If Name  False Then
ActiveWorkbook.SaveAs Name, FileFormat:=xlWorkbookDefault
End If
End Sub
Private Sub CommandButton3_Click()
Export Array("Ausgabe", "Quelle"), ActiveWorkbook
End Sub
Private Sub CommandButton9_Click()
Export Array("Partner1", "Partner2", "Partner3", "Partner4"), ActiveWorkbook
End Sub
Sub Gruppieren() 'Haupt-Makro 'CommandbuttonXXX_Click() 'name des makros anpassen
'Alle Blätter - mit Ausnahmen gruppieren
Dim wkb As Workbook, wks As Worksheet, dateVal As Variant
Dim sPrompt As String
Set wkb = ActiveWorkbook
EingabeDatum:
sPrompt = sPrompt & "Bitte ein gültiges Datum in der Form TT.MM.JJJJ eingeben:"
dateVal = InputBox(sPrompt, "Fälligkeitsdatum", "TT.MM.JJJJ") 'Datum für jedes Blatt
If dateVal = "" Then 'Abgebrochen
Exit Sub
ElseIf IsDate(dateVal) Then
dateVal = CDate(dateVal)
For Each wks In wkb.Worksheets
Select Case wks.Name
Case "Tabelle 1", "Steuerung"
'diese Blätter nicht bearbeiten
Case Else
Call GruppierenEinzeln(wks, dateVal)
End Select
Next
Else
sPrompt = "Eingabe ist kein gültiges Datum" & vbLf
GoTo EingabeDatum
End If
MsgBox "Fertig - Gruppieren"
End Sub
Sub GruppierenEinzeln(wks As Worksheet, ByVal dateVal As Date) 'Unter-Makro
With wks
Dim i As Long, j As Long
Dim LastRow As Long
Dim SumFaellig As Currency
Dim SumGes As Currency
SumFaellig = 0
SumGes = 0
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
.Cells.ClearOutline
Application.ScreenUpdating = False
For i = 2 To LastRow
If .Cells(i, 6) 

Anzeige
AW: Arrays aufrufen
23.04.2020 19:03:46
Sascha
Hallo Franz,
vielen Dank für deine Arbeit! Ich bin grade die Tür rein, auf den ersten Blick verstehe ich was du meinst und wie die Änderungen funktionieren. Tolle Sache! Nach dem Essen werde ich es implementieren und berichten wie es läuft.
Vielleicht eine Frage noch hinsichtlich deiner Aussage zum Übergeben des Blatts als Objekt da einfacher zu handhaben:
Aktuell deklariere ich alle Prozeduren stumpf in Tabelle1 im Projekt-Explorer. Würde es Performance Optimierungen bringen, wenn ich jede Prozedur in ein eigenes Modul Skripte?
Ich stelle mittlerweile durchaus fest, dass Excel mit den Tabellenblättern gut zu kämpfen hat. Vor allem dann, wenn ich als Input eine CSV eingebe mit 5000 Zeilen. Könnte ich da durch eine bessere Struktur optimieren oder ist Excel/VBA dafür in Summe einfach zu "schwach"?
Grüße
Sascha
Anzeige
AW: Arrays aufrufen
23.04.2020 20:27:14
Sascha
Wahnsinn! Läuft! Läuft richtig gut! Vielen vielen Dank Franz!
Kann ich dir die Tage noch ein, zwei oder auch drei weitere Fragen zum Thema stellen, die mir noch im Kopf rumschwirren?
Dankbare Grüße
Sascha
AW: Tabellenblatt Modul versus allgemeines Modul
23.04.2020 22:09:59
fcs
Hallo Sascha,
Kann ich dir die Tage noch ein, zwei oder auch drei weitere Fragen zum Thema stellen
Kein Problem, dafür ist dieses Forum da.
Zu deiner Frage:
Sind Makros unter dem Tabellenblatt-Modul oder in einem allgemeinen Modul schneller.
Das macht keinen Unterschied. Es spielt auch keine Rolle wie viele Makros in einem Modul angelegt sind.
Es gibt/gab aber eine Grenze für Menge an Code in einem Modul (zumindest in früheren Excel-Versionne).
Die Module dienen halt dazu bei größeren VBA-Projekten eine übersichtlich Struktur ins Projekt zu bringen. Benötigt man die gleiche Funktionalität in verschiedenen Arbeitsmappen, dann ist es sinnvoll entsprechende Module anzulegen, die man dann per Drag&Drop von einem ins andere VBA-Projekt kopieren kann.
Das Tabellenblatt-Modul dient hauptsächlich zum Anlegen der Ereignismakros, z.B. CommandButton1_Click etc. Gleiches gilt für Userform-Module und DieseArbeitsmappe.
Durch die große Anzahl an Zugriffen (Formatierungen und Einlesen/Schreiben von Zellen) wird dein Makro halt extrem langsam.
Bei den Formatierungen kann man da nur wenig ändern.
Für die Summenberechnungen macht es ggf. Sinn, die Daten des Zellbereichs, in dem das Datum verglichen und ggf. Zellwerte summiert werden sollen, in ein Array einzulesen und dann mit den Werte im Array zu arbeiten. Das geht um Größenordnungen schneller.
Ich hab das Gruppieren-Makro mal in diese Richtung angepasst.
LG
Franz
Sub GruppierenEinzeln(wks As Worksheet, ByVal dateVal As Date) 'Unter-Makro
With wks
Dim i As Long, j As Long
Dim LastRow As Long
Dim SumFaellig As Currency
Dim SumGes As Currency
Dim arrDatum, arrWerte
SumFaellig = 0
SumGes = 0
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
.Cells.ClearOutline
arrDatum = .Range(.Cells(1, 6), .Cells(LastRow, 6))
arrWerte = .Range(.Cells(1, 14), .Cells(LastRow, 14))
Application.ScreenUpdating = False
For i = 2 To LastRow
If arrDatum(i, 1) 

Anzeige
AW: Tabellenblatt Modul versus allgemeines Modul
24.04.2020 16:02:51
Sascha
Hallo Franz,
danke! Klappt alles super. Ich bin jetzt noch hingegangen und habe die 2. For-Schleife durch eine einfache Wert-Übergabe für "SumGes" ersetzt. Also mit der Function SUM das Array einfach addiert.
Nun zum nächsten Problem. In Summe sind es 4 teilweise unterschiedliche Auswertungen die erstellt werden.
Bei 3 von diesen dient eine CSV Datei als Quelle für die unterschiedlichen Exporte (mal 1 Blatt, mal 7 Blätter).
Im Prinzip kann ich für den 4. Export alle vorhandenen Funktionen nutzen, mit der einen Ausnahme, dass die Quelle für die 4. Auswertung nicht aus einer CSV Datei kommt, sondern aus 3 einzelnen.
Mein Gedanke war also, meinen Importmechanismus zu klonen und um "MultiSelect:=True" und ein wenig Code zu erweitern, damit die Nutzer die drei CSV Dateien auswählen und einlesen können.
Der "Solo"-Import sieht derzeit so aus:

Sub ImportCSVGroup()
On Error GoTo FehlerHandling
With ActiveWorkbook.Worksheets("Quelle")
.Cells.Clear
End With
Dim wS As Worksheet
Dim strFile As String
Set wS = Sheets("Quelle")
strFile = Application.GetOpenFilename("Text Files (*.csv),*.csv", , "Wählen Sie die CSV  _
Datei aus...", MultiSelect:=True)
With wS.QueryTables.Add(Connection:="TEXT;" & strFile, Destination:=wS.Range("A1"))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = False
.Refresh
End With
FehlerHandling:
Exit Sub
End Sub
Wie bekomme ich nun statt die 3 Listen zusammengeführt in mein Quell-Blatt "Quelle"?
Meine erster Gedanke war: aus strFile ein Array zu machen und dieses mit den 3 Listen zu füllen, aber ich schätze, dass dürfte sehr unpraktisch für ein Array sein, oder?
Danke dir vorab für deine Hilfe!
LG und schönen Start ins Wochenende
Sascha
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige