Der folgende Code ist eine Funktion zum Verschieben eines Arbeitsblatts in einer Arbeitsmappe. Es wird von einem Benutzerformular aufgerufen, das ein Listenfeld enthält, in dem die Arbeitsblätter in der Arbeitsmappe aufgelistet sind. Die Eingabe ist eine Ganzzahl, die angibt, in welche Richtung das Blatt bewegt werden soll. Links/rechts in der Arbeitsmappe ist hoch/runter in der Benutzerformular-Listbox, und das Benutzerformular hat Hoch- und Runter-Tasten, die die Funktion mit verschiedenen Eingaben aufrufen (+1 für die Bewegung nach rechts und -2 für die Bewegung nach links).Inkonsistenter Fehler beim Verschieben des Arbeitsblatts
Diese Funktion gibt manchmal die Fehlermethode 'Move' aus, wenn das Objekt '_Worksheeet' fehlgeschlagen ist, aber nicht konsistent. Meistens tritt der Fehler auf, wenn ein Blatt ein zweites Mal bewegt wird, so dass ich ein Blatt nicht mehr als einmal bewegen kann. Sobald der Fehler auftritt, kann ich das Blatt nicht mehr verschieben. Ich kann jedoch ein anderes Blatt auswählen und dieses einmal verschieben, bevor das Gleiche passiert.
Wenn ich ein Meldungsfeld in der Fehlerbehandlung implementieren, ändert sich das Verhalten. Nach dem Schließen des Meldungsfelds bei einem Fehler kann ich das gleiche Blatt nach einem Fehler erneut verschieben. Mit einer Nachrichtenbox kann ich also ein Blatt beliebig oft verschieben, aber es bewegt sich nur bei jedem weiteren Tastendruck. Ich nehme an, dass die Nachrichtenbox die Codeausführung unterbricht, was aus irgendeinem Grund die Funktion wieder zum Laufen bringt, sogar auf dem gleichen Blatt, das den Fehler verursacht hat. Ich habe versucht, die Nachrichtenbox mit einer Verzögerung oder einer selbstschließenden Infobox zu ersetzen, aber dies führt nicht zum selben Ergebnis.
Um die Angelegenheit noch komplizierter zu machen, manchmal, wenn ich die Benutzerformular-Anwendung öffne, funktionieren die Move-Tasten perfekt ohne Fehler. Ich denke, das passiert, wenn das Arbeitsblatt bereits geöffnet ist, bevor die Anwendung geöffnet wird.
Es scheint alles sehr inkonsequent und jenseits meines Wissens. Jede Hilfe oder Vorschläge sehr geschätzt.
Function FlyttMåling(Retning As Integer) As Boolean
Application.EnableEvents = False
Application.ScreenUpdating = False
'code to reference the correct workbook based on outside parameters
Dim wb As Workbook, ws As Worksheet
FlyttMåling = True
If Hovedvindu.LuftlydKnapp.Value = True Then
Set wb = ÅpneBok(1)
ElseIf Hovedvindu.TrinnlydKnapp.Value = True Then
Set wb = ÅpneBok(2)
End If
'sets variable to the index of sheet to be moved, chosen from list in userform
Dim nummer As Integer
Set ws = wb.Sheets(1)
If Hovedvindu.MålingerFrame.Liste.ListIndex < 0 Then
Exit Function
Else
Set ws = wb.Sheets(Hovedvindu.MålingerFrame.Liste.Value)
End If
nummer = ws.Index
'exit function if trying to move first sheet to the left or last sheet to the right
If (Retning = 1 And nummer = wb.Sheets.count) Or (Retning = -2 And nummer = 2) Then
Exit Function
End If
'code that moves worksheet
ws.Activate
On Error GoTo errHandler:
errResume:
ws.Move after:=wb.Sheets(nummer + Retning) 'THIS LINE CAUSES ERROR
On Error GoTo 0
Call oppdaterListe
'reselect the moved worksheet in the userform list
For i = 0 To Hovedvindu.MålingerFrame.Liste.ListCount - 1
If ws.Name = Hovedvindu.MålingerFrame.Liste.List(i) Then
Hovedvindu.MålingerFrame.Liste.Selected(i) = True
Exit For
End If
Next i
Application.EnableEvents = True
Application.ScreenUpdating = True
Exit Function
'error handling just sets the return to false to notify failure to move sheet
errHandler:
FlyttMåling = False
End Function
Haben Sie verifiziert, dass der Zug tatsächlich gültig ist? Ihr Code sagt "Verschieben Sie das Arbeitsblatt so, dass es nach dem Arbeitsblatt mit Index (Nummer + Retning) befindet" - Sind Sie sicher, dass ein Arbeitsblatt mit diesem bestimmten Index in den Fällen vorhanden ist, in denen Sie einen Fehler erhalten? Es sieht auch so aus, als würde Ihre Checkbox "Exit Function" nicht richtig ausgelöst, da die Bedingungen umgedreht werden. – Vegard
Der Umzug sollte gültig sein. Der Index wird aus der Benutzerformularliste ausgewählt, die von den Arbeitsmappenblättern ausgefüllt wird. Ich habe auch verifiziert, indem ich ein Nachrichtenfeld gedruckt habe, das den Arbeitsmappennamen, den Index und den Namen des zu verschiebenden Blattes anzeigt, das Indexblatt sollte sich zu etc bewegen, um manuell zu überprüfen, dass es versucht, das richtige Blatt zu verschieben. – ksund
Die Exit-Prüfung sollte korrekt sein. Wenn 'rebernd' = 1 ist, sollte sich das Blatt nach rechts bewegen (nach Index + 1). Dies sollte nicht passieren, wenn das Blatt bereits das letzte ist (= sheet.count). Wenn 'rebern' = -2, sollte sich das Blatt nach links bewegen. Dies sollte nicht passieren, wenn der Blattindex = 2 (Blatt Nr. 2 ist das erste Datenblatt und das erste in der Benutzerformularliste. Blatt Nr. 1 ist immer ein Dummyblatt, das nicht in der Benutzerformularliste angezeigt wird und niemals verschoben werden sollte) – ksund