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

@yummi Frage bezüglich seines Codes

@yummi Frage bezüglich seines Codes
23.11.2017 10:08:24
arek
Hi yummi,
du hast mir vor einigen Wochen ein Makro erstellt, das aus verschiedenen Stundenlisten Informationen ausliest (https://www.herber.de/bbs/user/117859.xlsm).
In jeder Stundenliste werden dabei die Zeilen ab Zeile 5 und die Spalten ab Spalte C durchlaufen bis zum Ende des Tabellenblattes. Jetzt möchte ich allerdings implementieren, dass die Stundenlisten von Zeile 5 bis Zeile 1700 durchlaufen werden und nicht alle Zeilen bis zum Ende des Tabellenblattes. Wie muss ich dazu den Code verändern? Kannst du mir bitte noch ein letztes Mal weiterhelfen?
Vielen Dank im Voraus!

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: @yummi Frage bezüglich seines Codes
23.11.2017 10:50:31
yummi
Hallo arek,
die Variable llastr ist verantwortlich bis zu welcher zeile durchlaufen wird.
die Varibale ilasts ist verantwortlich bis zu welcher spalte durchlaufen wird.
die Variable llastdest bestimmt dir die letze Zeile auf deinem Zielsheet.
Wenn Du also nciht bis zur letzten sondern bis 1700 durchalufen willst, musst du vor der for z Zeile nur schreiben den WErt schreiben, damit für den Fall, dass es weniger als 1700 Zeilen sind, so:

'alter code kann bleiben
llastr = BestimmeLetzteZeile(wksdata, 2)  'letzte Zeile erstellen
ilasts = BestimmeLetzteSpalte(wksdata, 2) 'letzte Spalte bestimmen
llastdest = BestimmeLetzteZeile(wksDest, 1) + 1
'neue Zeilen ergänzen
if llastr > 1700 then
llastr = 1700
end if
'alter code
For z = 5 To llastr   'Alle Zeilen ab Zeile 5 werden durchlaufen
Gruß
yummi
llastr = 1700
Anzeige
AW: @yummi Frage bezüglich seines Codes
23.11.2017 11:23:16
arek
Hi yummi,
vielen Dank! Das funktioniert gut! Jetzt hätte ich noch eine letzte Frage und zwar habe ich mein Code nochmals so verändert, dass nur für bestimmte Dateien aus dem Ordner, wo die Stundenlisten liegen, das Makro durchläuft...Allerdings führt dies zur Meldung "keine Rückmeldung" von Excel...Woran könnte das liegen? Kann es an dem von mir definierten Array liegen? Vielen Dank nochmal für deine Hilfe!
Hier mein aktueller Code:
Option Explicit
Dim wkb As Workbook
Dim wksdata As Worksheet
Dim wksDest As Worksheet
Dim wkbData As Workbook
Sub Update_Button()
Dim llastr As Long
Dim ilasts As Integer
Dim z As Long
Dim s As Integer
Dim llastdest As Long
Dim Pfad As String
Dim Dateiname As String
Dim iRow As Long
Dim arr, na, b As Boolean
Pfad = "C:\Users\arek\Desktop\Hours Booking" 'Pfad, unter welchem die Stundenlisten liegen
Dateiname = Dir(Pfad & "*.xlsm")
Initialisiere 'Funktion Initialisiere siehe unten
On Error Resume Next
wksDest.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeConstants).Value = ""
On Error GoTo 0
arr = Array("Christof", "Thomas")
Do While Dateiname  "" 'Durchlaufen der Stundenlisten
b = False
For Each na In arr
If InStr(1, Dateiname, "*" & na & "*_hours_booking*", vbTextCompare) Then
b = True
Exit For
Next na
If b = True Then
Set wkbData = Workbooks.Open(Filename:=Pfad & Dateiname)
Set wksdata = wkbData.Sheets("Hours")
llastr = BestimmeLetzteZeile(wksdata, 2)  'letzte Zeile erstellen
ilasts = BestimmeLetzteSpalte(wksdata, 2) 'letzte Spalte bestimmen
llastdest = BestimmeLetzteZeile(wksDest, 1) + 1
If llastr > 2000 Then
llastr = 2000
End If
For z = 5 To llastr   'Alle Zeilen ab Zeile 5 werden durchlaufen
For s = 3 To ilasts   'Alle Spalten ab Spalte C werden durchlaufen
If wksdata.Cells(z, s).Value  "" Then
'Zeile kopieren und anschließender Übergang zur nächsten Stundenliste
wksDest.Cells(llastdest, 1).Value = wksdata.Cells(2, s).Value  'Belegdatum
wksDest.Cells(llastdest, 2).Value = wksdata.Cells(2, s).Value  ' _
Buchungsdatum
wksDest.Cells(llastdest, 3).Value = wksdata.Cells(1, 1).Value  ' _
Kostenstelle
wksDest.Cells(llastdest, 4).Value = wksdata.Cells(1, 3).Value  ' _
Leistungsart
wksDest.Cells(llastdest, 6).Value = wksdata.Cells(z, 2).Value  'Projektname
wksDest.Cells(llastdest, 7).Value = wksdata.Cells(z, s).Value  'Menge
wksDest.Cells(llastdest, 8).Value = "H"                        'ME
wksDest.Cells(llastdest, 9).Value = wksdata.Cells(1, 2).Value  ' _
Personalnummer
llastdest = llastdest + 1
End If
Next s
Next z
wkbData.Close False
Set wksdata = Nothing
Set wkbData = Nothing
Dateiname = Dir()    'Automatische Auswahl der nächsten Datei
End If
Loop
End Sub
Function BestimmeLetzteZeile(ByVal wks As Worksheet, ByVal s As Integer) As Long
BestimmeLetzteZeile = wks.Cells(wks.Rows.Count, s).End(xlUp).Row
End Function

Function BestimmeLetzteSpalte(ByVal wks As Worksheet, ByVal z As Long) As Integer
If wks.Cells(z, 1).Value  "" Then
BestimmeLetzteSpalte = wks.Cells(z, wks.Columns.Count).End(xlToLeft).Column
Else
BestimmeLetzteSpalte = 1
End If
End Function

Function Initialisiere()
If wkb Is Nothing Then
Set wkb = ThisWorkbook
Set wksDest = wkb.Sheets("Tabelle1")
End If
End Function

Anzeige
AW: @yummi Frage bezüglich seines Codes
23.11.2017 11:43:38
yummi
Hallo arek,
setz mal einen breakpoint am anfang deines makros und geh mal mit F8 step by step duch das Makro, wann kommt die Fehlermeldung?
Falls es so nicht auftritt, kommentiere mal bitte die On error Behandlung aus und lass es dann laufen.
Wo tritt der Fehler auf?
Gruß
yummi
AW: @yummi Frage bezüglich seines Codes
25.11.2017 08:50:16
arek
Hi yummi,
danke für deine Antwort!...Welchen Teil des Codes meinst du mit "on error Behandlung auskommentieren"?
Viele Grüße
Arek
AW: @yummi Frage bezüglich seines Codes
27.11.2017 09:04:36
yummi
Hallo Arek
die Zeile mit on error resume next, aber nur um den Fehler zu finden, danach wieder einkommentieren.
Gruß
yummi
AW: @yummi Frage bezüglich seines Codes
27.11.2017 14:46:26
arek
Hi yummi
danke für deine Antwort! Ich habe jetzt mal den Teil auskommentiert und dann markiert er mir die Zeile: wksDest.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeConstants).Value = ""
Es kommt die Fehlermeldung: Laufzeitfehler 1004 - keine Zellen gefunden
Leider weis ich nicht weiter...Kannst du mir nochmals weiterhelfen?
Oder gibt es noch eine andere Möglichkeit zu programmieren, um nur bestimmte Dateien aus dem Ordner zu durchlaufen mit dem Makro?
Hast du hierzu eine Idee?
Nochmals vielen Dank für deine Antwort!
Anzeige
AW: @yummi Frage bezüglich seines Codes
28.11.2017 09:53:47
yummi
Hallo Arek,
bau mal folgende Sicherheitsabfrage ein:
in der Funktion definierst du
Dim FoundCells As Range
dann vor der von dir angegebneen Zelle
Set FoundCells = wksDest.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeConstants)
if not FoundCells is nothing then
jetzt die Zeile die du angegeben hast
end if
und weiter im normalen Code
Das überprüft, ob in dem angegebenen Bereich überhaupt Zellen mit Konstanten WErten vorhanden sind und nur dann wird der wert ="" gesetzt.
Gruß
yummi
AW: @yummi Frage bezüglich seines Codes
29.11.2017 14:52:40
arek
Hi yummi,
vielen Dank für deine Antwort! Ich habe nun folgenden Code, aber nachwievor das Problem, dass beim Start des Makros "keine Rückmeldung" leider kommt. Könntest du dir das nochmal anschauen bitte? Siehst du eine andere Möglichkeit wie man nur bestimmte Dateien durch das Makro ansprechen kann? Vielen Dank dir nochmal!
Sub Update_Button()
Dim llastr As Long
Dim ilasts As Integer
Dim z As Long
Dim s As Integer
Dim llastdest As Long
Dim Pfad As String
Dim Dateiname As String
Dim iRow As Long
Dim arr, na, b As Boolean
Dim FoundCells As Range
Pfad = "C:\Users\arek\Desktop\TEST\" 'Pfad, unter welchem die Stundenlisten liegen
Dateiname = Dir(Pfad & "*.xlsm")
Initialisiere 'Funktion Initialisiere siehe unten
On Error Resume Next
Set FoundCells = wksDest.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeConstants)
If Not FoundCells Is Nothing Then
wksDest.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeConstants).Value = ""
End If
On Error GoTo 0
arr = Array("Christof", "Thomas")
Do While Dateiname  "" 'Durchlaufen der Stundenlisten
b = False
For Each na In arr
If InStr(1, Dateiname, "*" & na & "*_hours_booking*", vbTextCompare) Then
b = True
Exit For
End If
Next na
If b = True Then
Set wkbData = Workbooks.Open(Filename:=Pfad & Dateiname)
Set wksdata = wkbData.Sheets("Hours")
llastr = BestimmeLetzteZeile(wksdata, 2)  'letzte Zeile erstellen
ilasts = BestimmeLetzteSpalte(wksdata, 2) 'letzte Spalte bestimmen
llastdest = BestimmeLetzteZeile(wksDest, 1) + 1
If llastr > 2000 Then 'Stundenlisten nur bis Zeile 2000 durchlaufen
llastr = 2000
End If
For z = 5 To llastr   'Alle Zeilen ab Zeile 5 werden durchlaufen
For s = 3 To ilasts   'Alle Spalten ab Spalte C werden durchlaufen
If wksdata.Cells(z, s).Value  "" Then
'Zeile kopieren und anschließender Übergang zur nächsten Stundenliste
wksDest.Cells(llastdest, 1).Value = wksdata.Cells(2, s).Value  'Belegdatum
wksDest.Cells(llastdest, 2).Value = wksdata.Cells(2, s).Value  ' _
Buchungsdatum
wksDest.Cells(llastdest, 3).Value = wksdata.Cells(1, 1).Value  ' _
Kostenstelle
wksDest.Cells(llastdest, 4).Value = wksdata.Cells(1, 3).Value  ' _
Leistungsart
wksDest.Cells(llastdest, 6).Value = wksdata.Cells(z, 2).Value  'Projektname
wksDest.Cells(llastdest, 7).Value = wksdata.Cells(z, s).Value  'Menge
wksDest.Cells(llastdest, 8).Value = "H"                        'ME
wksDest.Cells(llastdest, 9).Value = wksdata.Cells(1, 2).Value  ' _
Personalnummer
llastdest = llastdest + 1
End If
Next s
Next z
wkbData.Close False
Set wksdata = Nothing
Set wkbData = Nothing
Dateiname = Dir()    'Automatische Auswahl der nächsten Datei
End If
Loop
End Sub
Function BestimmeLetzteZeile(ByVal wks As Worksheet, ByVal s As Integer) As Long
BestimmeLetzteZeile = wks.Cells(wks.Rows.Count, s).End(xlUp).Row
End Function

Function BestimmeLetzteSpalte(ByVal wks As Worksheet, ByVal z As Long) As Integer
If wks.Cells(z, 1).Value  "" Then
BestimmeLetzteSpalte = wks.Cells(z, wks.Columns.Count).End(xlToLeft).Column
Else
BestimmeLetzteSpalte = 1
End If
End Function

Function Initialisiere()
If wkb Is Nothing Then
Set wkb = ThisWorkbook
Set wksDest = wkb.Sheets("Tabelle1")
End If
End Function

Anzeige
AW: @yummi Frage bezüglich seines Codes
29.11.2017 15:22:15
yummi
Hallo Arek,
du musst versuchen festzustellen, wann deine Meldung "keine Rückmeldung" kommt. Du könntest zeilen in dienn code einstreunen in der form
debug.print "bis hierhin"
du musst natürlich immer was anderes zwisc hen die Hochkommata schreiben. Den Output siehst du im Direktbereich von Visual Basic.
Eine andere Methode, die was bringen könnte

Function Beschleunigen(ByVal BGesetzt As Boolean)
BGesetzt = Not BGesetzt
With Application
.ScreenUpdating = BGesetzt
.AskToUpdateLinks = BGesetzt
.EnableEvents = BGesetzt
.Calculation = BGesetzt
.DisplayAlerts = BGesetzt
End With
End Function
mit aufnehmen und nach Initialisieren dann Beschleunigen TRUE aufrufen und am Ende deines Makros Beschleunigen FALSE
Das aus der Ferne zu beseitigen ist schwer.
Gruß
yummi
Anzeige
AW: @yummi Frage bezüglich seines Codes
29.11.2017 15:39:00
arek
Hi yummi,
nochmals danke für deine Antwort!
Ich werde das ausprobieren, gleichzeitig wollte ich fragen, ob du für den folgenden Code eine andere Möglichkeit siehst, einzelne Dateien aus dem Ordner "TEST" anzusprechen. Dieser Code macht genau das was ich eig möchte für alle Dateien in dem Ordner, mein Ziel ist es aber eben das auf bestimmte Dateien zu begrenzen...Ich hoffe du hast mich verstanden?!?
Option Explicit
Dim wkb As Workbook
Dim wksdata As Worksheet
Dim wksDest As Worksheet
Dim wkbData As Workbook
Sub Update_Button()
Dim llastr As Long
Dim ilasts As Integer
Dim z As Long
Dim s As Integer
Dim llastdest As Long
Dim Pfad As String
Dim Dateiname As String
Dim iRow As Long
Dim arr, na, b As Boolean
Dim FoundCells As Range
Pfad = "C:\Users\arek\Desktop\TEST\" 'Pfad, unter welchem die Stundenlisten liegen
Dateiname = Dir(Pfad & "*.xlsm")
Initialisiere 'Funktion Initialisiere siehe unten
On Error Resume Next
wksDest.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeConstants).Value = ""
On Error GoTo 0
Do While Dateiname  "" 'Durchlaufen der Stundenlisten
Set wkbData = Workbooks.Open(Filename:=Pfad & Dateiname)
Set wksdata = wkbData.Sheets("Hours")
llastr = BestimmeLetzteZeile(wksdata, 2)  'letzte Zeile erstellen
ilasts = BestimmeLetzteSpalte(wksdata, 2) 'letzte Spalte bestimmen
llastdest = BestimmeLetzteZeile(wksDest, 1) + 1
If llastr > 2000 Then 'Stundenlisten nur bis Zeile 2000 durchlaufen
llastr = 2000
End If
For z = 5 To llastr   'Alle Zeilen ab Zeile 5 werden durchlaufen
For s = 3 To ilasts   'Alle Spalten ab Spalte C werden durchlaufen
If wksdata.Cells(z, s).Value  "" Then
'Zeile kopieren und anschließender Übergang zur nächsten Stundenliste
wksDest.Cells(llastdest, 1).Value = wksdata.Cells(2, s).Value  'Belegdatum
wksDest.Cells(llastdest, 2).Value = wksdata.Cells(2, s).Value  ' _
Buchungsdatum
wksDest.Cells(llastdest, 3).Value = wksdata.Cells(1, 1).Value  ' _
Kostenstelle
wksDest.Cells(llastdest, 4).Value = wksdata.Cells(1, 3).Value  ' _
Leistungsart
wksDest.Cells(llastdest, 6).Value = wksdata.Cells(z, 2).Value  'Projektname
wksDest.Cells(llastdest, 7).Value = wksdata.Cells(z, s).Value  'Menge
wksDest.Cells(llastdest, 8).Value = "H"                        'ME
wksDest.Cells(llastdest, 9).Value = wksdata.Cells(1, 2).Value  ' _
Personalnummer
llastdest = llastdest + 1
End If
Next s
Next z
wkbData.Close False
Set wksdata = Nothing
Set wkbData = Nothing
Dateiname = Dir()    'Automatische Auswahl der nächsten Datei
Loop
End Sub
Function BestimmeLetzteZeile(ByVal wks As Worksheet, ByVal s As Integer) As Long
BestimmeLetzteZeile = wks.Cells(wks.Rows.Count, s).End(xlUp).Row
End Function

Function BestimmeLetzteSpalte(ByVal wks As Worksheet, ByVal z As Long) As Integer
If wks.Cells(z, 1).Value  "" Then
BestimmeLetzteSpalte = wks.Cells(z, wks.Columns.Count).End(xlToLeft).Column
Else
BestimmeLetzteSpalte = 1
End If
End Function

Function Initialisiere()
If wkb Is Nothing Then
Set wkb = ThisWorkbook
Set wksDest = wkb.Sheets("Tabelle1")
End If
End Function

Anzeige
AW: @yummi Frage bezüglich seines Codes
29.11.2017 15:54:11
yummi
Hallo Arek,
wenn deine Dateine im Namen alle was gemeinsam haben, dann könntest Du das in der Zeile
Dateiname = Dir(Pfad & "*.xlsm")
verarbeiten
z.B.
Dateiname = Dir(Pfad & "Stunden*.xlsm")
oder *Stunden* müsste auch gehen. Probier mal aus.
Gruß
yummi
AW: @yummi Frage bezüglich seines Codes
29.11.2017 16:01:27
arek
Hi yummi,
danke für diese Idee! Die Dateien heißen alle "Name"_hours_booking leider, aber mir ist jetzt gerade hoffentlich ein Licht aufgegangen. Die Dateien, die ich ansprechen möchte, haben in Zelle A1 in dem Tabellenblatt "Hours" nicht das Wort "Filter" enthalten. Wäre das eine Möglichkeit? Hättest du dazu eine Idee?
Vielen Dank nochmal!
Anzeige
AW: @yummi Frage bezüglich seines Codes
29.11.2017 16:39:36
yummi
Hallo Arek,
auf die Zelle kannst du ja erst zugreifen, wenn du die Datei geöffnet hast.
aber versuch mal die zeile so zu ändern
Dateiname = Dir(Pfad & "*_hours_booking.xlsm")
SChau mal ob dich das näher ans Ziel bringt, sont muss ich morgen noch mal was überlegen
Gruß
yummi
AW: @yummi Frage bezüglich seines Codes
29.11.2017 16:49:50
arek
Hi yummi,
danke für deine Antwort. Leider heißen alle Dateien in diesem Ordner mit _hours_booking und nur die Namen sind unterschiedlich...Die Dateien heißen also alle Vorname_Nachname_hours_booking. Hättest du da eine Idee? Nochmals danke!
VG

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige