移动工作表

时间:2017-08-07 07:19:59

标签: vba excel-vba excel

下面的代码是一个在工作簿中移动工作表的函数。它从包含列出工作表中工作表的列表框的userform调用。输入是一个整数,给出移动工作表的方向。工作簿中的左/右在用户窗体列表框中向上/向下,并且用户窗体具有向上和向下按钮,这些按钮使用不同的输入调用该函数(向右移动+1,向左移动-2)。

如果对象'_Worksheeet'失败,此函数有时会给出错误方法'Move',但不一致。大多数情况下,第二次移动工作表时会出现错误,因此我无法多次移动工作表。一旦发生错误,我无法再次移动工作表。但是,我可以选择一个不同的工作表,并在发生同样的事情之前移动一次。

如果我在错误处理中实现了一个消息框,则行为会发生变化。在出错时关闭消息框后,我可以在发生错误后再次移动相同的工作表。有了一个消息框,我可以根据需要多次移动一张纸,但它只会在每次按下按钮时移动。我想消息框会破坏代码执行,由于某种原因使得函数再次工作,即使是同一张给出错误的工作表。我尝试用延迟或自封闭信息框替换消息框,但这不会产生相同的结果。

更复杂的是,有时当我打开用户窗体应用程序时,移动按钮可以正常工作而不会出现任何错误。我认为在打开应用程序之前工作表已经打开时会发生这种情况。

这一切似乎非常不一致,而且超出我的知识。任何帮助或建议非常感谢。

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 个答案:

答案 0 :(得分:0)

为此问题找到了解决方法。将wb.move更改为wb.copy,然后删除旧工作表并将副本重命名为原始工作表的名称使该代码按预期工作。