Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1528to1532
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

Daten mit for-Schleife kopieren

Daten mit for-Schleife kopieren
15.12.2016 18:49:39
Sav
Hallo liebes Forum,
ich möchte gerne mit einem Makro mehrere Tabelleblätter mit der selben Struktur auslesen und die Informationen in einem Sheet vereinen (untereinander kopieren).
Um die Daten zu kopieren habe ich die Funktion Database_fill()" geschrieben, welche auch gut funktioniert hat.
Nun wollte ich das kopieren von mehreren Sheets durch eine for-Schleife "TabellenBlätter()" erledigen lassen. Die Deklarierung der Variablen der "Database_fill()" habe ich der Funktion "TabellenBlätter()" hinzugefügt.
Leider funktioniert der Code nicht. Ich vermute dass die Werte nicht richtig übergeben werden.
Kann mir jemand einen Tipp geben wo der Fehler liegt?

Sub TabellenBlätter()
Dim Anfang_Input As Long ' First row of Input
Dim Ende_Input As Long ' Last row of Input
Dim Anfang_Output As Long ' First row of Output
Dim Ende_Output As Long ' Last row of Output
Dim WS As String ' Active worksheet
Dim ProcessName As String
Dim ProcessID As String
Anfang_Input = 2
Worksheets("database").Range("A2:Z1000000").ClearContents
Dim Anzahl As Long 'Anzahl der Tabellenblätter ermitteln
Anzahl = ThisWorkbook.Sheets.Count 'Anzahl = ThisWorkbook.Worksheets.Count
MsgBox Anzahl
'Tabellenblätter mit dem Index ansprechen
Dim i As Long
For i = 2 To Anzahl - 6 ' Ab Tabellenblatt 2 außer die letzten 6 Tabellenblätter
MsgBox i
Call Database_fill
Next i
End Sub

Sub Database_fill()
WS = ThisWorkbook.Worksheets(i)
ProcessName = Worksheets(WS).Cells(5, 7)
ProcessID = Worksheets(WS).Cells(4, 7)
'INPUT
'Copy Input Process name
Worksheets(WS).Range("D8:D37").Copy
Worksheets("database").Range("D" & Anfang_Input).PasteSpecial Paste:=xlPasteValues
'Copy Input Process ID
Worksheets(WS).Range("C8:C37").Copy
Worksheets("database").Range("E" & Anfang_Input).PasteSpecial Paste:=xlPasteValues
'Copy Input Value
Worksheets(WS).Range("E8:E37").Copy
Worksheets("database").Range("F" & Anfang_Input).PasteSpecial Paste:=xlPasteValues
'Input: Fill ProcessName and ProcessID
Ende_Input = Worksheets("database").Cells(Rows.Count, 6).End(xlUp).Row
Worksheets("database").Range("A" & Anfang_Input & ":" & "A" & Ende_Input).Value = ProcessName
Worksheets("database").Range("B2:B" & Ende_Input).Value = ProcessID
Worksheets("database").Range("C2:C" & Ende_Input).Value = "Input"
'OUTPUT - Die Process Values dienen als Grenze zwischen den Inputs und Outputs da diese immer   _
_
befüllt sein sollen!
Anfang_Output = Ende_Input + 1
'Copy Output Process name
Worksheets(WS).Range("L8:L37").Copy
Worksheets("database").Range("D" & Anfang_Output).PasteSpecial Paste:=xlPasteValues
'Copy Output Process ID
Worksheets(WS).Range("M8:M37").Copy
Worksheets("database").Range("E" & Anfang_Output).PasteSpecial Paste:=xlPasteValues
'Copy Output Value
Worksheets(WS).Range("K8:K37").Copy
Worksheets("database").Range("F" & Anfang_Output).PasteSpecial Paste:=xlPasteValues
'Output: Fill ProcessName and ProcessID
Ende_Output = Worksheets("database").Cells(Rows.Count, 6).End(xlUp).Row
Worksheets("database").Range("A" & Anfang_Output & ":" & "A" & Ende_Output).Value = ProcessName
Worksheets("database").Range("B" & Anfang_Output & ":" & "B" & Ende_Output).Value = ProcessID
Worksheets("database").Range("C" & Anfang_Output & ":" & "C" & Ende_Output).Value = "Output"
Anfang_Input = Ende_Output + 1
End Sub

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Daten mit for-Schleife kopieren
15.12.2016 19:12:23
ChrisL
Hi Sav
Randbemerkungen:
- Du hast hier zwei separate Prozeduren und keine Funktion (VBA Function).
- Die Deklaration von i As Long ist OK und ich mache darum im Beispiel mit Long weiter. Integer hätte aber vermutlich auch gereicht.
- Anstelle eine Übergabe der Variable i könntest du auch gleich eine Worksheet Variable übergeben. Auch ein Detail.
- Die entscheidende Variable i könnte man auch einfach ausserhalb der Prodzedur als Public (öffentlich) deklarieren und die Variable bliebe für die zweite Prozdur erhalten (Problem gelöst). Jedoch scheint mir eine "Übergabe" wie von dir gewünscht tatsächlich eleganter.
Die Übergabe funktioniert so...
Sub TabellenBlätter()
Call Database_fill(i)
Next i
End Sub

Sub Database_fill(i As Long)
Dim WS As Worksheet
Dim ProcessName As String
Set WS = ThisWorkbook.Worksheets(i)
ProcessName = WS.Cells(5, 7)
End Sub

cu
Chris
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige