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

Code Erklärung

Code Erklärung
04.11.2020 20:33:56
Jochen
Hallo Excel-Freude,
ich würde mich über eine Erklärung des unten aufgeführten Codes freuen. Ich glaube der erste Teil fragt mich fragt welche Datei geöffnet werden soll und wo sie liegt. Der zweite Teil des Codes liest mir Daten aus anderen Dateien, jeweils 7 Tabellenblätter, ein. Die Tabellen haben 109 Zeilen aber es wird nur bis zur Zeile 60 gelesen. An welcher Stelle im Code kann ich das beeinflussen.
Erster Teil:
Public Sub ImportReports()
Dim intChoice As Integer
Dim strPath As String
Dim i As Integer
'allow the user to select multiple files
Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = True
Application.FileDialog(msoFileDialogOpen).Title = "Bitte wählen Sie die Berichte aus..."
Application.FileDialog(msoFileDialogOpen).Filters.Clear
Application.FileDialog(msoFileDialogOpen).Filters.Add "Excel 2010", "*.xlsm"
'make the file dialog visible to the user
intChoice = Application.FileDialog(msoFileDialogOpen).Show
'determine what choice the user made
If intChoice  0 Then
'get the file path selected by the user
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For i = 1 To Application.FileDialog(msoFileDialogOpen).SelectedItems.Count
strPath = Application.FileDialog(msoFileDialogOpen).SelectedItems(i)
'print the file path to sheet 1
'Cells(i + 1, 1) = strPath
Import strPath
Next i
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End If
End Sub
Zweiter Teil:
Public Sub Import(strPath As String)
Dim wb As Workbook
Dim sht As Worksheet
Dim lastrow As Long
Dim activeWb As Workbook
Dim masterSht As Worksheet
activeWb = ThisWorkbook
masterSht = activeWb.Worksheets("Rohdaten")
lastrow = masterSht.UsedRange.Rows(masterSht.UsedRange.Rows.Count).Row
wb = Workbooks.Open(strPath)
For i = 1 To 7
sht = wb.Sheets(i)
Cells(lastrow + 1, 1) = strPath
Next i
Workbooks(strPath).Close
End Sub

Ich hoffe das ich mit einigermaßen verständlich ausgedrückt habe.
Danke im Voraus
Jochen
https://www.herber.de/bbs/user/141321.xlsm

24
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code Erklärung
05.11.2020 00:02:29
ralf_b

For i = 1 To 7
sht = wb.Sheets(i)  'Zuweisung des Tabellenblattes der geöffneten Datei zur Variable sht
Cells(lastrow + 1, 1) = strPath 'Pfad der Datei wird in Zelle des aktiven Blattes  _
geschrieben
Next i
in der for next schleife wird nichts dergleichen getan was du da mit den Zeilen 60 oder 109 vor hast.
dein makro 2 hab ich dir angepasst
Sub Makro2()
' Makro2 Makro
With Sheets("Rohdaten")
.Range("A3:A" & .Cells(Rows.Count, "A").End(xlUp).Row).Copy Sheets("Tabelle1").Range(" _
A1")
End With
Application.CutCopyMode = False
With Sheets("Tabelle1")
.Range("$A$1:$A$" & .Cells(Rows.Count, "A").End(xlUp).Row).RemoveDuplicates Columns:=1,  _
Header:=xlNo
End With
Application.Goto Reference:="R1C1"
End Sub

Anzeige
AW: Code Erklärung
05.11.2020 10:25:35
Yal
Ja, das Problem kommt in zweiten Blok vor.
Dort wird dynamsich festgelegt, welche "die letzte Zeile" ist:
lastrow = masterSht.UsedRange.Rows(masterSht.UsedRange.Rows.Count).Row
Erstens: es bezieht sich stets auf dem Blatt "Rohdaten" von ThisWorkbook. Ist das richtig so?
Zweitens: der "Count" zwischen Klammer liefert einen Zahl, nicht einen Range, den dann als Range-Adresse verwendet wird. Probiere:
lastrow = masterSht.UsedRange.Rows.Count
Viel Erfolg
Yal
AW: Code Erklärung
05.11.2020 10:46:53
ralf_b
@ Yal
In Rohdaten wird der Pfad in die Spalte A geschrieben. Dort steht aber als Überschrift "Name".
Ich schätze die Baustelle ist etwas größer.
Das mit den geklammerten Rows.count ist schon umständlicher aber was ist wenn die usedrange nicht in Zeile 1 anfängt?
masterSht.UsedRange.Rows.Count liefert die Zeilenanzahl, nicht die Nummer
Anzeige
AW: Code Erklärung
05.11.2020 11:01:14
Yal
@Ralf,
ja, richtig. Ich kenne UsedRange kaum und musste es testen. zuerst 3 leeren Zeilen vor Zeile 1 eingefügt:
    Debug.Print Me.UsedRange.Rows.Count '-> 47
Debug.Print Me.UsedRange.Rows(Me.UsedRange.Rows.Count).Row '-> 51
Ich verwende allgemein
Me.Range("A100000").End(xlUp).Row

weil UsedRange nicht selten leere Zeilen unten beinhaltet.
Wenn man eine gezielte Spalte als Eingangsgröße verwendet, ist es zielgerichteter. Aber es ist nur eigene Vorliebe.
Viel Erfolg
Yal
AW: Code Erklärung
05.11.2020 11:15:04
ralf_b
da hat so Jeder seine Vorlieben. Is ja nicht mein Code.
Ich nutze usedrange eigentlich selbst auch eher weniger um genaue Positionen zu bekommen. Aber solange es im Einzelfall praktikabel ist, warum nicht?
Im Grunde muß man nur sicher sein können, das keine Ausnahmen von gewählten Weg vorkommen und dir das Debuggerfenster ersparen.
Anzeige
AW: Code Erklärung
05.11.2020 19:07:59
Jochen
Hallo Ralf, hallo Yal,
erst einmal Danke für eure Mühe. Da meine VBA Kenntnisse wirklich nicht so gut sind wie eure, wäre meine Bitte, mir doch die Code’s so zusammen zusetzen das ich die 1 zu 1 übernehmen kann. Ich bedanke mich im Voraus für eure Mühe.
Jochen
AW: Code Erklärung
05.11.2020 20:41:28
Peer
Hallo ralf_b.
Quelldaten sollten doch in der gesendeten Beispiel-Datei sein.
Ich denke, die Datei war nicht für mich bestimmt. ;-)
Ich habe etwas mit deinen Erklärungen anfangen können und habe ein paar Anpassungen getätigt.
    Dim lngMonth As Long, ialngIndex As Long, lngRow As Long, lngColumn As Long
Dim avntValues() As Variant, avntTemp As Variant, vntItem As Variant
For lngMonth = 1 To 2 'auf 12 Monate erhöhen!!!
lngRow = 12
With Worksheets(MonthName(Month:=lngMonth))
Do
If IsEmpty(.Cells(lngRow + 1, 26).Value) Then
lngRow = .Cells(lngRow, 26).End(xlDown).Row
Else
lngRow = lngRow + 1
End If
If lngRow = TimeSerial(24, 0, 0) Then avntValues(5,  _
ialngIndex) = "24:00"
ElseIf lngColumn = 9 Then
Select Case vntItem
Case Is = TimeSerial(24, 0, 0)
avntValues(10, ialngIndex) = "24,00 €"
avntValues(9, ialngIndex) = "24:00"
Case Is > TimeSerial(8, 0, 0)
avntValues(10, ialngIndex) = "12,00 €"
Case Else
avntValues(10, ialngIndex) = "Fehler"
Debug.Print vntItem
End Select
lngColumn = lngColumn + 1
End If
lngColumn = lngColumn + 1
Case Else
avntValues(lngColumn, ialngIndex) = vntItem
lngColumn = lngColumn + 1
End Select
Next
avntValues(14, ialngIndex) = .name & "|" & CStr(lngRow)
ialngIndex = ialngIndex + 1
Else
Exit Do
End If
Loop
End With

Nun habe ich noch die Spaltengrößen in den Eigenschaften angepasst.
https://www.herber.de/bbs/user/141349.xlsm
Jetzt bräuchte ich noch Hilfe bei den beiden berechneten Spalten.
Gruß Peer
Anzeige
AW: Code Erklärung
06.11.2020 01:12:23
ralf_b
@ Peer , ich schätze du bist im falschen Thread.
Stimmt,Sorry.
06.11.2020 09:45:54
Peer
;-(
AW: Code Erklärung
06.11.2020 20:19:45
Jochen
Hallo Ralf, ich habe mir die Datei herunter geladen, leider funktioniert sie bei mir nicht.
Public Sub Import(strPath As String)
Dim wb As Workbook
Dim sht As Worksheet
Dim lastrow As Long
Dim activeWb As Workbook
Dim masterSht As Worksheet
Dim i As Integer
<b> activeWb = ThisWorkbook</b> <<<<<< an dieser Stelle bleibt das Makro stehen?
masterSht = activeWb.Worksheets("Rohdaten")
lastrow = masterSht.Cells(Rows.Count, 1).End(xlUp).Row 'letzte Zeile Spalte 1
Hast du da eine Lösung?
Gruß
Jochen
Anzeige
AW: Code Erklärung
06.11.2020 21:12:37
ralf_b
füge ein set davor ein
Set activeWb = ThisWorkbook
AW: Code Erklärung
07.11.2020 11:20:41
Jochen
Hallo Ralf,
jetzt bleibt das Makro hier stehen
wb = Workbooks.Open(strPath)~f~
setze ich ein Set davor läuft es bis an diese Stelle weiter
~f~sht = wb.Sheets(i)
und bleibt wieder stehen.
Da hilft kein set
AW: Code Erklärung
07.11.2020 11:41:45
Daniel
Hi
Immer dann wenn du einer Variablen ein Objekt zuweist (Workbook, Sheet, Range), muss "Set" davor.
Ohne Set gehts nur bei Zuweisung von Einzelwerten (Zahl, Text) oder Arrays mit Zahlen oder Texten.
Also muss es auch lauten
Set sht = WB.Sheets(i)

Wobei i einen Wert zwischen 1 und der Anzahl der Blätter haben darf.
Gruß Daniel
Anzeige
AW: Code Erklärung
07.11.2020 12:57:08
Jochen
Hallo Ralf, ein mal bleibt das Makro noch stehen und zwar an dieser Stelle:
Next i
Workbooks(strPath).Close
End Sub
Dann ist da noch eine Frage.
Ist es möglich, das dass Makro an dem letzten Eintrag der Tabelle aufhört und zum nächsten Tabellenblatt geht?
AW: Code Erklärung
07.11.2020 13:11:16
ralf_b
vieles ist möglich.
ersetze doch mal
Workbooks(strPath).Close
durch
wb.Close
AW: Code Erklärung
07.11.2020 13:21:12
Jochen
Hallo Ralf, jetzt schließt die Datei aber das Makro bleibt jetzt wieder im ersten Teil an dieser Stelle hängen
With Sheets("Tabelle1")
AW: Code Erklärung
07.11.2020 14:25:25
ralf_b
versuchs mal damit
with ActiveWorkbook.Sheets("Tabelle1")
AW: Code Erklärung
07.11.2020 18:46:03
Jochen
Ralf,
funktioniert leider nicht;-(
Anzeige
AW: Code Erklärung
07.11.2020 21:03:26
ralf_b
da ich deine Softwareumgebung nicht nachstellen kann, und ich denke das du hier mit noch anderen Codebestandteilen arbeitest, bringt dieses Ratespiel nichts.
Deine beiden Importroutinen waren nicht! in der Datei. Kann es sein das du da mit Addins oder andern externen Codes arbeitest? Wenn ich deine Beispieldatei öffne kommt immer eine Fehlermeldung das eine Master.vsto Datei fehlt.
"Funktioniert nicht " ist zu wenig Information um einem Fehler auf den Grund zu gehen.
AW: Code Erklärung
08.11.2020 12:28:12
Jochen
Hallo Ralf, ich möchte noch einmal versuchen dir mein Problem zu erklären:
Es laufen keine weiteren Aktionen im Hintergrund. Was ich noch nicht verstehe das das Macro immer an dieser Stelle stehen bleibt
With ActiveWorkbook.Sheets("Tabelle1") 'With Sheets("Tabelle1")
.Range("$A$4:$W$" & .Cells(Rows.Count, "A").End(xlUp).Row).RemoveDuplicates Columns:=1, Header:=xlNo
End With
Eine Tabelle 1 gibt es nicht, es sei den es wird die Ursprungsbezeichnung genutzt, was ich nicht glaube. Es werden alle Daten eingelesen und erst am Ende bleibt es an der o. g. Stelle hängen.
Das "funktioniert leider nicht;-(" war vielleicht ein bisschen wenig!
Danke schon mal im Voraus für deine Bemühungen.
Anzeige
AW: Code Erklärung
08.11.2020 15:26:34
ralf_b
der Abschnitt mit Tabelle1 stammt aus deinem Makro2. Dann sag doch mal in welcher spalte die Doppelten herausgefiltert werden sollen und zu welchem Punkt im Programmablauf?
Da in deiner Beispieltabelle eine Tabelle1 vorhanden ist, mußte ich annehmen das diese auch benutzt werden soll.
AW: Code Erklärung
08.11.2020 17:59:28
Jochen
Hallo Ralf, gut das wir noch mal gesprochen haben.
Den Part mit Tabelle 1 brauche ich an dieser Stelle nicht, wieder mal schlecht von mir erklärt, sorry.
Mein Makro läuft jetzt, super.
Danke noch mal und ein schönes Rest Wochenende.
danke für die Rückmeldung owt
08.11.2020 18:15:42
ralf_b

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige