Datenimport - Fehler beim ersten Import

Moderator: ModerationP

Datenimport - Fehler beim ersten Import

Beitragvon 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 :roll:
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!
Benji162
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 20
Registriert: 15. Mär 2016, 13:27

Re: Datenimport - Fehler beim ersten Import

Beitragvon Xlsibb » 17. Mai 2019, 13:08

Hallo,

das ist relativ einfach: dann liegt der Fokus noch nicht auf dem Worksheet, in der es das Blatt "Import" gibt (was wahrscheinlich das Workbook des Makros ist).
Wenn du das ergänzt mit ThisWorkbook.Sheets("Import") sollte alles funktionieren.
Benutzeravatar
Xlsibb
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1164
Registriert: 26. Feb 2009, 17:07

Re: Datenimport - Fehler beim ersten Import

Beitragvon Benji162 » 17. Mai 2019, 13:18

Hallo Xlsibb,

ThisWorkbook.Sheets("Import") anstatt Worksheets("Import") ?

Muss ich dann durch die Bank bei allen Worksheets-Nutzungen umsteigen auf ThisWorkbook.Sheets? Oder hat da VBA nix dagegen?

LG Benji
Benji162
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 20
Registriert: 15. Mär 2016, 13:27

Re: Datenimport - Fehler beim ersten Import

Beitragvon TommyDerWalker » 17. Mai 2019, 15:06

Hey,

Schaden kann es natürlich nie anständig zu referenzieren.
Das Workbook mit anzugeben macht aber nur dann wirklich sinn wenn du mit verschiedenen Mappen arbeitest innerhalb Deines Codes und das Risiko das Du den Fokus auf das Workbook verlierst (Richtige Mappe nicht aktiv)

Was Dir aber viel Schreibart erspart ist zb ein With Block.
Diesen benutzt Du ja zb schon in deinem Code:

Code: Alles auswählen
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

Leider nutzt Du noch nicht das volle Potenzial der With Methode aus. Du könntest Dir zb einiges an Schreibarbeit ersparen wenn Du es so gemacht hättest:

Code: Alles auswählen
With ThisWorkbook.Sheets("Ü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
   
           .Cells(lngErsteLeereZeile, 1) = EinsGebCombo.Value 'EinsGeb als ComboBox in Formular
           .Cells(lngErsteLeereZeile, 2) = TransportNummerBox.Value 'IdentNr als TxtFeld in Formular
           .Cells(lngErsteLeereZeile, 3) = KalenderwocheBox.Value 'Kalenderwoche als Txt-Feld in Formular
           .Cells(lngErsteLeereZeile, 4) = ThisWorkbook.Sheets("Import").Cells(4, 1) 'Beginn-Datum aus Import-Daten Zelle A4
           .Cells(lngErsteLeereZeile, 5) = ThisWorkbook.Sheets("Import").Cells(LetzteZeileImport, 1) 'Enddatum aus Import-Daten letzte Zeile
           .Cells(lngErsteLeereZeile, 6) = KühlartCombo.Value 'Kühlart als ComboBox in Formular
           .Cells(lngErsteLeereZeile, 7) = ThisWorkbook.Sheets("Import").Application.WorksheetFunction.Min(Range("B:B")) 'Niedrigsten Messwert aus Impoprt-Daten
           .Cells(lngErsteLeereZeile, 8) = ThisWorkbook.Sheets("Import").Application.WorksheetFunction.Max(Range("B:B")) 'Höchster Messwert aus Import-Daten
           .Cells(lngErsteLeereZeile, 9) = ThisWorkbook.Sheets("Import").Cells(VorletzteZeileImport, 1) 'Vorletzter Messzeitpunkt aus Import-Daten
           .Cells(lngErsteLeereZeile, 10) = ThisWorkbook.Sheets("Import").Cells(VorletzteZeileImport, 2) 'Vorletzter Messwert aus Import-Daten
         
    End With


Oben gibst Du Deine Mappe und das Sheet an:
Code: Alles auswählen
With ThisWorkbook.Sheets("Übersicht")


Unten referenzierst Du mit dem . (Punkt) auf die Mappe und das Sheet:
Code: Alles auswählen
.Cells(lngErsteLeereZeile, 1) = EinsGebCombo.Value 'EinsGeb als ComboBox in Formular


Oder was auch möglich ist.

Code: Alles auswählen
Set wb = ThisWorkbook

           wb.Sheets("Übersicht").Cells(lngErsteLeereZeile, 1) = EinsGebCombo.Value 'EinsGeb als ComboBox in Formular
           wb.Sheets("Übersicht").Cells(lngErsteLeereZeile, 2) = TransportNummerBox.Value 'IdentNr als TxtFeld in Formular
           wb.Sheets("Übersicht").Cells(lngErsteLeereZeile, 3) = KalenderwocheBox.Value 'Kalenderwoche als Txt-Feld in Formular



Auch etwas übersichtlicher und kürzer, aber die With Methode ist da halt die beste Alternative

Gruß
Thomas
Windows10 PRO 64Bit MSOffice32Bit/64Bit --2007/2010/2013/2016/2019--
Eifersucht ist die Leidenschaft, die mit Eifer sucht, was Leiden schafft.
If Not CODE Working Then Goto http://www.office-loesung.de/p
On Error GoTo Hell
Benutzeravatar
TommyDerWalker
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1038
Registriert: 16. Jan 2015, 14:49
Wohnort: Wuppertal NRW

Re: Datenimport - Fehler beim ersten Import

Beitragvon Benji162 » 20. Mai 2019, 10:21

Guten Morgen!

Danke Thomas für Deine ausführliche Antwort.

Davon abgesehen, dass jetzt alles so funktioniert wie es soll, habe ich jetzt auch noch eine ganze Menge bezüglich der With-Methode dazugelernt.

Hab auch gleich noch meinen Code danach angepasst. Richtig genutzt, spart man mit With tatsächlich einiges an Schreibarbeit.

Tausend Dank!
Benji162
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 20
Registriert: 15. Mär 2016, 13:27

Re: Datenimport - Fehler beim ersten Import

Beitragvon Benji162 » 20. Mai 2019, 10:40

Jetzt quält mich doch noch etwas.

Ich habe dazu mal eine anonymisierte Beispiel-Datei hochgeladen.

Der letzte Eintrag in der "Übersicht" ist das Ergebnis des letzten Imports. Weder Min- noch Max-Temperatur wurden richtig umgesetzt.

Im Blatt "Import" habe ich den zugehörigen Datensatz nochmal reingepackt.

Wo liegt denn der Fehler in meinem Code, der das verursacht?
Mit Einzelschrittdurchlauf habe ich auch nichts gefunden, was das verursacht. Ich fürchte es scheitert einfach mal wieder an meinem eingeschränkten Wissen bezüglich VBA.

LG Benji
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Benji162
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 20
Registriert: 15. Mär 2016, 13:27

Re: Datenimport - Fehler beim ersten Import

Beitragvon TommyDerWalker » 20. Mai 2019, 11:50

Hey,

weil Du statt der unteren Formatierung die obere genommen hast ? Oder was ist das Problem ?

20-05-_2019_12-48-23.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Windows10 PRO 64Bit MSOffice32Bit/64Bit --2007/2010/2013/2016/2019--
Eifersucht ist die Leidenschaft, die mit Eifer sucht, was Leiden schafft.
If Not CODE Working Then Goto http://www.office-loesung.de/p
On Error GoTo Hell
Benutzeravatar
TommyDerWalker
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1038
Registriert: 16. Jan 2015, 14:49
Wohnort: Wuppertal NRW

Re: Datenimport - Fehler beim ersten Import

Beitragvon Benji162 » 20. Mai 2019, 12:37

Nein das ist nicht das Problem.

In "Übersicht" Spalte G und H stehen falsche Werte, welche nicht existieren.

Wie erwähnt ist in "Import" nochmal der in "Übersicht" Zeile 17 bereits ausgewertete Datensatz drin.

Durch Code ausgewertete Daten: Min: 0,00°C Max: 44608,00°C.
Tatsächliche Daten gemäß Datensatz: Min: 3,00°C Max: 26,5°C

Das Programm zieht sich also nicht die tatsächlichen Daten (Min/Max-Werte) sondern irgendwelche anderen.

Bei anderen Datensätzen gelingt die Auswertung ohne Probleme. Da ist bisher erst der zweite der solche Macken macht

Ich hoffe jetzt ist es verständlicher.

MfG
Benji162
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 20
Registriert: 15. Mär 2016, 13:27

Re: Datenimport - Fehler beim ersten Import

Beitragvon TommyDerWalker » 20. Mai 2019, 13:44

Hey,

ohne mich jetzt genau in Deine Mappe einzuarbeiten sind mir 6 Stellen im Code aufgefallen bei denen Du den . (Punkt) nicht gesetzt hast und damit nicht vernünftig referenzierst.
Sprich, wenn der Code durchläuft funktioniert alles, wenn zufällig die richtige Mappe mit dem richtigen Blatt erwischt wird.
Hast Du andere Dateien dabei geöffnet oder falsche Blätter aktiv kann es zu Fehlern kommen.
2 Fehlende Punkte waren in deiner Worksheet Function Min / Max (daher vermutlich die falschen Ergebnisse)

Bei mir funktionierten die Probeläufe (nach besten Wissen was passieren soll ;))

Schau Dir den Code in der angehängten Mappe mal an. Vor allem die Unterschiede zu Deiner Datei, wie gesagt es haben 6 Punkte gefehlt...

Gruß
Thomas

TempProtokoll - Muster.xlsm
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Windows10 PRO 64Bit MSOffice32Bit/64Bit --2007/2010/2013/2016/2019--
Eifersucht ist die Leidenschaft, die mit Eifer sucht, was Leiden schafft.
If Not CODE Working Then Goto http://www.office-loesung.de/p
On Error GoTo Hell
Benutzeravatar
TommyDerWalker
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1038
Registriert: 16. Jan 2015, 14:49
Wohnort: Wuppertal NRW

Re: Datenimport - Fehler beim ersten Import

Beitragvon DerHoepp » 20. Mai 2019, 14:36

Moin,

eine unerwartete Zahl zwischen 42000 und 45000 deutet immer darauf hin, dass du einen Datumswert auswertest, statt eines Temperaturwertes.

Viele Grüße
derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7891
Registriert: 14. Mai 2013, 11:08

Re: Datenimport - Fehler beim ersten Import

Beitragvon Benji162 » 21. Mai 2019, 14:47

Vielen Dank für Eure Hilfe.

Es scheint jetzt tatsächlich alles so zu funktionieren wie es soll. Die Punkte waren wirklich ursächlich für das Dilemma, wie es aussieht.

@DerHoepp: Bei der neuerlichen Umwandlung hat er die ausgespuckte Zahl in ein Datum gebracht, welches nicht mal im Ansatz zu den restlichen Daten passt,
bzw. 2 Jahre von allen anderen Datumsangaben abweicht. Ist aber auch nicht nochmal passiert nach den letzten Anpassungen.

Wie gesagt Tausend Dank für Eure Hilfe!
Benji162
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 20
Registriert: 15. Mär 2016, 13:27


Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: TommyDerWalker und 21 Gäste