我正在创建一个用户表单(具有写入Excel工作表的SAVE按钮和返回至初始页面的RETURN按钮),并且想要设置/检查标志(如果表单上有未保存的更改)。根据是否设置了断点,我得到的代码功能有所不同。
这是代码的相关部分:
Public saveFlag as Boolean
Private Sub UserForm_Initialize()
initializeCMAValues Me
initializeTeamValues Me, getRowNum("CMA", "Team", False)
' getRowNum is a function that returns the row to read from
' in this case, the row with name=CMA, type=Team, createRow=False
saveFlag = False
End Sub
Private Sub btn_Return_Click()
' Check for unsaved data
If saveFlag Then
If MsgBox("You have unsaved information on the form. Do you wish to save it?", vbYesNo, "Unsaved Data") = vbYes Then
btn_Save_Click
End If
End If
' Return to splash form
Unload Me
Form_Splash.Show
End Sub
如果我输入表单并选择RETURN,则会收到msgbox提示。如果我在saveFlag = False
行设置了一个断点,请输入表格,选择RETURN(调用断点),继续运行,然后它会按我的期望运行(即没有msgbox)。
我尝试将标志写到表单上的不可见标签上,而不是使用公共的saveFlag变量。我也尝试过写入Excel工作表中的单元格。不管有没有断点,这两种行为都给出了相同结果。
我还运行了带有注释的initializeTeamValues行的代码,然后代码运行良好。我已经三重检查了此子例程仅将值填充到表单上的文本框中,而没有其他内容。
一些研究提出了一个与OLE将值推入堆栈有关的模糊答案。然后,我尝试将“ saveFlag = False”行放在子例程的开头。结果相同。
为什么行为各不相同?有没有更好/另一种方法来检查未保存的数据?