Excel VBA:在ActiveX重新调整此工作簿后关闭保存提示时。已保存=True
我在Excel中遇到了一个有趣的情况,我想知道你们中是否有人知道答案/解决方案 设置: 我有一个空的excel工作表,上面有一个ActiveX切换按钮。 在VBA代码中,我将按钮的宽度更改为0,然后将宽度更改为100。(我为什么这样做是另一个问题,它是一个更大项目的一部分,然而,这导致了问题) 然后我将工作簿的保存状态设置为true,而不实际保存工作簿 通常,如果我现在关闭工作簿,它会关闭,而不询问我是否要保存。 现在,由于调整了大小,即使.Saved状态为True,当我关闭工作簿时,它会询问我是否要保存,并且通过单击excel的关闭图标,.Saved状态设置为“False” 如果您想自己尝试,请尝试以下步骤。 或者,为了方便起见,我在这里上传了相同的文件:() 1) 创建新工作簿并添加新的ACTIVEX切换按钮。 2) 在工作簿的VBA代码中,添加以下代码 3) 保存工作簿,关闭它,然后重新打开它。 4) 您应该会看到一个消息框,单击后,作为第二个消息框 5) 现在工作簿的状态为“已保存” 6) 尝试关闭工作簿->如果要保存,系统将提示您 7) 如果您现在检查.saved状态,它会显示“false” 期待您的真知灼见Excel VBA:在ActiveX重新调整此工作簿后关闭保存提示时。已保存=True,excel,vba,activex,Excel,Vba,Activex,我在Excel中遇到了一个有趣的情况,我想知道你们中是否有人知道答案/解决方案 设置: 我有一个空的excel工作表,上面有一个ActiveX切换按钮。 在VBA代码中,我将按钮的宽度更改为0,然后将宽度更改为100。(我为什么这样做是另一个问题,它是一个更大项目的一部分,然而,这导致了问题) 然后我将工作簿的保存状态设置为true,而不实际保存工作簿 通常,如果我现在关闭工作簿,它会关闭,而不询问我是否要保存。 现在,由于调整了大小,即使.Saved状态为True,当我关闭工作簿时,它会询问我
Private Sub Workbook_Open()
MsgBox "Now a macro will run and resize twice the button you see." & vbCrLf & "Afterwards, the status of the workbook will be set to 'saved'." & vbCrLf & "However, upon closing, excel will still prompt to save."
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = wb.Sheets(1)
ws.Shapes("ToggleButton1").Width = 0
ws.Shapes("ToggleButton1").Width = 100
wb.Saved = True
MsgBox "Macro finished, save status is: " & wb.Saved
End Sub
Private Sub CheckSaveStatus()
MsgBox "Save status is: " & ActiveWorkbook.Saved
End Sub
请尝试以下方法:
Option Explicit
Dim wb As Workbook
Dim ws As Worksheet
Dim i As Integer
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If i = 1 Then
wb.Saved = False
Else
wb.Saved = True
End If
End Sub
Private Sub Workbook_Open()
MsgBox "Now a macro will run and resize twice the button you see." & vbCrLf & "Afterwards, the status of the workbook will be set to 'saved'." & vbCrLf & "However, upon closing, excel will still prompt to save."
Set wb = ThisWorkbook
Set ws = wb.Sheets(1)
ws.Shapes("ToggleButton1").Width = 0
ws.Shapes("ToggleButton1").Width = 100
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
i = 1
End Sub
解决方案如下所示:
Private Sub Workbook_Open()
MsgBox "Now a macro will run and resize twice the button you see." & vbCrLf & "Afterwards, the status of the workbook will be set to 'saved'." & vbCrLf & "However, upon closing, excel will still prompt to save."
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = wb.Sheets(1)
Dim boolSaved As Boolean
boolSaved = wb.Saved
ws.Shapes("ToggleButton1").Width = 0
ws.Shapes("ToggleButton1").Width = 100
If boolSaved Then wb.Save
MsgBox "Macro finished, save status is: " & wb.Saved
End Sub
这种技术可以在代码中的任何地方使用,在那里您需要做一些“弄脏”工作簿的事情。它的优点在于,如果用户修改了工作簿,它会保留保存提示
至于它发生的原因,最好的猜测是-Excel中的(另一个)ActiveX错误。我的经验是,此Excel错误是由于使用VBA代码更改某些ActiveX/OLE控件的某些属性的值而触发的。我没有这类房产的完整列表,但这里有一些: 命令按钮:
- 已启用属性
- 高度属性
- 前景色属性
- 背景色属性
'*************************************************************************************************************
'EXCEL OLE/ACTIVE-X SAVE-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案
'
(有关完整的解释,请参阅ThisWorkbook模块中的工作簿\u BeforeClose事件处理程序。)
'
Public SuppressWKBKSaveMg为布尔值
'
'结束保存错误解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案
“***************************************************************************************************************************************************************************************************************************************************************************************************
Private子工作簿\u关闭前(取消为布尔值)
'*************************************************************************************************************
'EXCEL OLE/ACTIVE-X SAVE-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案
'
“Excel有一个非常微妙的错误,如果您更改某些ActiveX/OLE的某些属性的值
'控件时,父工作簿的Saved属性将无法正常运行,直到下一个实际工作簿
'保存事件。也就是说,您可以随后将工作簿的Saved属性设置为True,但Excel仍将
'关闭工作簿时提示用户是否保存工作簿。事实上,如果您检查
'在工作簿中保存的属性\u在关闭事件处理程序之前,它将被定义为False,即使没有更改
已在显式将工作簿设置为True后对其进行了设置!
'
'最有效的解决方法是将工作簿已保存属性的覆盖推迟到关闭事件
'已实际启动:在标准模块中声明项目全局SuppressWkBkSaveMsg变量,
'将此工作簿\u BeforeClose事件处理程序添加到ThisWorkbook模块,然后将SuppressWKBKSaveMG设置为
'如果需要禁止Excel的用户询问是否保存对工作簿的更改,则为True
“在关闭它之前。
'
如果suppressWKBKSaveMG,则Me.Saved=True
'
'结束保存错误解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案
'*************************************************************************************************************
末端接头
“执行不需要保存的操作,包括修改OLE/ActiveX控件对象。。。
'
'*************************************************************************************************************
'EXCEL OLE/ACTIVE-X SAVE-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案
'
(有关完整的解释,请参阅ThisWorkbook模块中的工作簿\u BeforeClose事件处理程序。)
'
suppressWKBKSavemg=True
'
'结束保存错误解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案
'*************************************************************************************************************
'
“…
谢谢,尼古拉斯,在你的建议中,你在关闭工作簿时设置了“保存”标志。这确实会阻止“保存提示”