【发布时间】:2017-08-29 19:16:21
【问题描述】:
下面的代码是一个在工作簿中移动工作表的函数。它从包含列出工作簿中的工作表的列表框的用户窗体中调用。输入是一个整数,它给出了移动工作表的方向。工作簿中的左/右在用户窗体列表框中向上/向下,并且用户窗体具有向上和向下按钮,它们调用具有不同输入的函数(+1 用于向右移动,-2 用于向左移动)。
如果对象“_Worksheet”失败,此函数有时会给出错误方法“移动”,但不一致。大多数情况下,第二次移动工作表时会出现错误,因此我无法多次移动工作表。一旦发生错误,我将无法再次移动工作表。但是,我可以选择不同的工作表并在相同的事情发生之前将其移动一次。
如果我在错误处理中实现一个消息框,行为就会改变。出错时关闭消息框后,我可以在出错后再次移动同一张表。因此,使用消息框,我可以根据需要多次移动工作表,但它只会在每隔一个按钮按下时移动。我猜消息框会中断代码执行,由于某种原因,这会使函数再次工作,即使是给出错误的同一张表。我尝试用延迟或自动关闭信息框替换消息框,但这并没有给出相同的结果。
更复杂的是,有时当我打开用户窗体应用程序时,移动按钮可以正常工作而没有任何错误。我认为在打开应用程序之前工作表已经打开时会发生这种情况。
这一切似乎都非常不一致,超出了我的知识范围。非常感谢任何帮助或建议。
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
【问题讨论】:
-
您是否验证了该移动实际上是有效的?您的代码显示“移动工作表,使其位于具有索引(nummer + Retning)的工作表之后” - 在出现错误的情况下,您确定存在具有此特定索引的工作表吗?看起来您的“退出功能”检查也不会正确触发,因为条件被翻转了。
-
移动应该是有效的。该索引是从由工作簿工作表填充的用户表单列表中选择的。我还通过打印显示工作簿名称、索引和要移动的工作表名称的消息框进行了验证,索引工作表应移动到等以手动验证它是否尝试移动正确的工作表。
-
退出检查应该是正确的。如果 'retning' = 1,则工作表应向右移动(在 index+1 之后)。如果工作表已经是最后一张(=sheet.count),则不应发生这种情况。如果'retning' = -2,工作表应该向左移动。如果工作表索引 = 2,则不应发生这种情况(工作表 nr 2 是第一个数据表,并且是用户表单列表中的第一个。工作表 nr 1 始终是一个虚拟工作表,未显示在用户表单列表中,并且永远不应移动)
-
好的,我现在更好地看到了您的“退出函数”逻辑。我想 应该 也解决任何辅助工作表引用问题......但可以肯定的是,您能否验证您在移动中引用的工作表也有效?我的意思是
wb.Sheets(nummer + Retning)。您可以通过添加一个简单的Debug.Print wb.Sheets(nummer + Retning).Name来做到这一点(如果引用无效,则会出错。 -
我刚刚验证了你的建议,当错误发生时,要移动的工作表和应该放置的工作表都是有效的。