von Benji162 » 17. Mai 2019, 13:04
Hallo werte Experten!
Ich als VBA-Anfänger habe mit learning-by-doing einen Code geschrieben, der grundsätzlich so funktioniert wie ich möchte, jedoch immer wieder in den Debug-Modus springt.
Zur Erklärung:
Es geht um Auslesen von Temperaturüberwachungsprotokollen.
In das Tabellenblatt "Import" wird ein Datensatz reinkopiert (unterschiedlich viele Zeilen, immer drei Spalten).
Mit einem Button im Tabellenblatt wird ein Formular aufgerufen, in welchem Rahmendaten zum Datensatz eingetragen werden müssen.
Mit Klick auf den Eintragen-Button im Formular sollen die Rahmendaten sowie gesuchte Daten aus dem Datensatz (Niedrigster Messwert, Höchster Messwert, Beginn und Ende der Messung,...) ausgelesen werden und im Anschluss daran in die Tabelle "Übersicht" eingetragen werden.
Ist dies geschehen, soll der Datensatz aus "Import" gelöscht werden und die Übersicht aufgerufen werden.
Dort laufen dann noch Bedingte Formatierungen über die Tabelle um relevante Auffälligkeiten zu markieren.
Alles gut soweit.
Zum Problem:
Wenn ich einen neuen Datensatz reinkopiere, die Zusatzdaten ins Formular bringe und den Eintragen-Button klicke, bringt er mir den Laufzeitfehler 9: Index liegt außerhalb des gültigen Bereiches.
und markiert mir die Zeile: "LetztezeileImport = Worksheets....", meines Codes. Also mit welcher der Code die letzte Zeile suchen soll.
Wenn ich den Debug-Modus beende und den Datensatz dann nochmal importieren will, klappt dies auch ohne erneuten Fehler.
Ich vermute, dass VBA durch den Laufzeitfehler dann die letzte Zeile kennt und annimmt, daher beim zweiten Mal ohne Fehler.
Könnt Ihr mal über meinen Code drüberschauen und mir zeigen wie ich diesen Fehler bereinigen kann?
Bitte geht nicht zu hart mit mir ins Gericht, ich ärger mich so schon schwarz, dass ich nicht alleine auf die Lösung komme
Hier der Code zum Formular:
- Code: Alles auswählen
Private Sub EintragenButton_Click() 'Durch Klick auf den Button die Werte aus der Userform in die Zellen schreiben
Dim LetzteZeileImport As Long
LetzteZeileImport = 0
LetzteZeileImport = Worksheets("Import").Cells(Rows.Count, 1).End(xlUp).Row 'letzte beschriebene Zeile in Import, Spalte A ermitteln
Dim VorletzteZeileImport As Long
VorletzteZeileImport = 0
VorletzteZeileImport = Worksheets("Import").Cells(Rows.Count, 1).End(xlUp).Row - 1 'vorletzte beschriebene Zeile in Import, Spalte A ermitteln
With Worksheets("Übersicht")
Dim lngErsteLeereZeile As Long 'erste freie Zeile bestimmen
Range("A65536").End(xlUp).Select 'und eins draufaddieren damit man die erste freie Zeile bekommt
lngErsteLeereZeile = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'Erste leere Zeile suchen
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 1) = EinsGebCombo.Value 'EinsGeb als ComboBox in Formular
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 2) = TransportNummerBox.Value 'IdentNr als TxtFeld in Formular
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 3) = KalenderwocheBox.Value 'Kalenderwoche als Txt-Feld in Formular
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 4) = ThisWorkbook.Sheets("Import").Cells(4, 1) 'Beginn-Datum aus Import-Daten Zelle A4
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 5) = ThisWorkbook.Sheets("Import").Cells(LetzteZeileImport, 1) 'Enddatum aus Import-Daten letzte Zeile
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 6) = KühlartCombo.Value 'Kühlart als ComboBox in Formular
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 7) = ThisWorkbook.Sheets("Import").Application.WorksheetFunction.Min(Range("B:B")) 'Niedrigsten Messwert aus Impoprt-Daten
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 8) = ThisWorkbook.Sheets("Import").Application.WorksheetFunction.Max(Range("B:B")) 'Höchster Messwert aus Import-Daten
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 9) = ThisWorkbook.Sheets("Import").Cells(VorletzteZeileImport, 1) 'Vorletzter Messzeitpunkt aus Import-Daten
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 10) = ThisWorkbook.Sheets("Import").Cells(VorletzteZeileImport, 2) 'Vorletzter Messwert aus Import-Daten
'.Activate
'.Rows(Sheets("Übersicht").Cells(Rows.Count, 1).End(xlUp).Row).Select
End With
With Worksheets("Import")
ThisWorkbook.Sheets("Import").Range("A:C").ClearContents
Cells(1, 1).Select
End With
Sheets("Übersicht").Activate
Unload Me
End Sub
Vielen Dank für Eure Zeit schon mal!
Hallo werte Experten!
Ich als VBA-Anfänger habe mit learning-by-doing einen Code geschrieben, der grundsätzlich so funktioniert wie ich möchte, jedoch immer wieder in den Debug-Modus springt.
Zur Erklärung:
Es geht um Auslesen von Temperaturüberwachungsprotokollen.
In das Tabellenblatt "Import" wird ein Datensatz reinkopiert (unterschiedlich viele Zeilen, immer drei Spalten).
Mit einem Button im Tabellenblatt wird ein Formular aufgerufen, in welchem Rahmendaten zum Datensatz eingetragen werden müssen.
Mit Klick auf den Eintragen-Button im Formular sollen die Rahmendaten sowie gesuchte Daten aus dem Datensatz (Niedrigster Messwert, Höchster Messwert, Beginn und Ende der Messung,...) ausgelesen werden und im Anschluss daran in die Tabelle "Übersicht" eingetragen werden.
Ist dies geschehen, soll der Datensatz aus "Import" gelöscht werden und die Übersicht aufgerufen werden.
Dort laufen dann noch Bedingte Formatierungen über die Tabelle um relevante Auffälligkeiten zu markieren.
Alles gut soweit.
Zum Problem:
Wenn ich einen neuen Datensatz reinkopiere, die Zusatzdaten ins Formular bringe und den Eintragen-Button klicke, bringt er mir den Laufzeitfehler 9: Index liegt außerhalb des gültigen Bereiches.
und markiert mir die Zeile: "LetztezeileImport = Worksheets....", meines Codes. Also mit welcher der Code die letzte Zeile suchen soll.
Wenn ich den Debug-Modus beende und den Datensatz dann nochmal importieren will, klappt dies auch ohne erneuten Fehler.
Ich vermute, dass VBA durch den Laufzeitfehler dann die letzte Zeile kennt und annimmt, daher beim zweiten Mal ohne Fehler.
Könnt Ihr mal über meinen Code drüberschauen und mir zeigen wie ich diesen Fehler bereinigen kann?
Bitte geht nicht zu hart mit mir ins Gericht, ich ärger mich so schon schwarz, dass ich nicht alleine auf die Lösung komme :roll:
Hier der Code zum Formular:
[code]
Private Sub EintragenButton_Click() 'Durch Klick auf den Button die Werte aus der Userform in die Zellen schreiben
Dim LetzteZeileImport As Long
LetzteZeileImport = 0
LetzteZeileImport = Worksheets("Import").Cells(Rows.Count, 1).End(xlUp).Row 'letzte beschriebene Zeile in Import, Spalte A ermitteln
Dim VorletzteZeileImport As Long
VorletzteZeileImport = 0
VorletzteZeileImport = Worksheets("Import").Cells(Rows.Count, 1).End(xlUp).Row - 1 'vorletzte beschriebene Zeile in Import, Spalte A ermitteln
With Worksheets("Übersicht")
Dim lngErsteLeereZeile As Long 'erste freie Zeile bestimmen
Range("A65536").End(xlUp).Select 'und eins draufaddieren damit man die erste freie Zeile bekommt
lngErsteLeereZeile = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'Erste leere Zeile suchen
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 1) = EinsGebCombo.Value 'EinsGeb als ComboBox in Formular
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 2) = TransportNummerBox.Value 'IdentNr als TxtFeld in Formular
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 3) = KalenderwocheBox.Value 'Kalenderwoche als Txt-Feld in Formular
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 4) = ThisWorkbook.Sheets("Import").Cells(4, 1) 'Beginn-Datum aus Import-Daten Zelle A4
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 5) = ThisWorkbook.Sheets("Import").Cells(LetzteZeileImport, 1) 'Enddatum aus Import-Daten letzte Zeile
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 6) = KühlartCombo.Value 'Kühlart als ComboBox in Formular
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 7) = ThisWorkbook.Sheets("Import").Application.WorksheetFunction.Min(Range("B:B")) 'Niedrigsten Messwert aus Impoprt-Daten
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 8) = ThisWorkbook.Sheets("Import").Application.WorksheetFunction.Max(Range("B:B")) 'Höchster Messwert aus Import-Daten
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 9) = ThisWorkbook.Sheets("Import").Cells(VorletzteZeileImport, 1) 'Vorletzter Messzeitpunkt aus Import-Daten
ThisWorkbook.Sheets("Übersicht").Cells(lngErsteLeereZeile, 10) = ThisWorkbook.Sheets("Import").Cells(VorletzteZeileImport, 2) 'Vorletzter Messwert aus Import-Daten
'.Activate
'.Rows(Sheets("Übersicht").Cells(Rows.Count, 1).End(xlUp).Row).Select
End With
With Worksheets("Import")
ThisWorkbook.Sheets("Import").Range("A:C").ClearContents
Cells(1, 1).Select
End With
Sheets("Übersicht").Activate
Unload Me
End Sub[/code]
Vielen Dank für Eure Zeit schon mal!