2017-08-07 4 views
0

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 
+1

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

+0

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

+0

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

Antwort

0

Eine Problemumgehung für dieses Problem gefunden. Wenn Sie den wb.move in eine wb.copy ändern und dann das alte Blatt löschen und die Kopie in den Namen des Originalblattes umbenennen, funktioniert dieser Code wie beabsichtigt.

Verwandte Themen