Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:在ActiveX重新调整此工作簿后关闭保存提示时。已保存=True_Excel_Vba_Activex - Fatal编程技术网

Excel VBA:在ActiveX重新调整此工作簿后关闭保存提示时。已保存=True

Excel VBA:在ActiveX重新调整此工作簿后关闭保存提示时。已保存=True,excel,vba,activex,Excel,Vba,Activex,我在Excel中遇到了一个有趣的情况,我想知道你们中是否有人知道答案/解决方案 设置: 我有一个空的excel工作表,上面有一个ActiveX切换按钮。 在VBA代码中,我将按钮的宽度更改为0,然后将宽度更改为100。(我为什么这样做是另一个问题,它是一个更大项目的一部分,然而,这导致了问题) 然后我将工作簿的保存状态设置为true,而不实际保存工作簿 通常,如果我现在关闭工作簿,它会关闭,而不询问我是否要保存。 现在,由于调整了大小,即使.Saved状态为True,当我关闭工作簿时,它会询问我

我在Excel中遇到了一个有趣的情况,我想知道你们中是否有人知道答案/解决方案

设置: 我有一个空的excel工作表,上面有一个ActiveX切换按钮。 在VBA代码中,我将按钮的宽度更改为0,然后将宽度更改为100。(我为什么这样做是另一个问题,它是一个更大项目的一部分,然而,这导致了问题)

然后我将工作簿的保存状态设置为true,而不实际保存工作簿

通常,如果我现在关闭工作簿,它会关闭,而不询问我是否要保存。 现在,由于调整了大小,即使.Saved状态为True,当我关闭工作簿时,它会询问我是否要保存,并且通过单击excel的关闭图标,.Saved状态设置为“False”

如果您想自己尝试,请尝试以下步骤。 或者,为了方便起见,我在这里上传了相同的文件:()

1) 创建新工作簿并添加新的ACTIVEX切换按钮。 2) 在工作簿的VBA代码中,添加以下代码 3) 保存工作簿,关闭它,然后重新打开它。 4) 您应该会看到一个消息框,单击后,作为第二个消息框 5) 现在工作簿的状态为“已保存” 6) 尝试关闭工作簿->如果要保存,系统将提示您 7) 如果您现在检查.saved状态,它会显示“false”

期待您的真知灼见

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控件的某些属性的值而触发的。我没有这类房产的完整列表,但这里有一些:

命令按钮:

  • 已启用属性

  • 高度属性

文本框:

  • 前景色属性

  • 背景色属性

我使用了一个通用的系统(类似于Nikolaos Polygenis的解决方案),由于这个bug的微妙之处,包括了广泛的解释,如下所示:

  • 在标准模块中,定义项目全局变量以指示无需保存的条件:
    '*************************************************************************************************************
    'EXCEL OLE/ACTIVE-X SAVE-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案
    '
    (有关完整的解释,请参阅ThisWorkbook模块中的工作簿\u BeforeClose事件处理程序。)
    '
    Public SuppressWKBKSaveMg为布尔值
    '
    '结束保存错误解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案
    “***************************************************************************************************************************************************************************************************************************************************************************************************

  • 在ThisWorkbook模块中,将以下工作簿放置在关闭事件处理程序之前,并提供完整解释:

    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
    '
    '结束保存错误解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案
    '*************************************************************************************************************
    末端接头

  • 在代码中的任何位置,在任何模块中,只要有必要在关闭工作簿之前禁止Excel用户查询是否保存对工作簿的更改,请将SuppressWKBKSaveMG设置为True:

    “执行不需要保存的操作,包括修改OLE/ActiveX控件对象。。。
    '
    '*************************************************************************************************************
    'EXCEL OLE/ACTIVE-X SAVE-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案-BUG变通方案
    '
    (有关完整的解释,请参阅ThisWorkbook模块中的工作簿\u BeforeClose事件处理程序。)
    '
    suppressWKBKSavemg=True
    '
    '结束保存错误解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案-结束解决方案
    '*************************************************************************************************************
    '
    “…


  • 谢谢,尼古拉斯,在你的建议中,你在关闭工作簿时设置了“保存”标志。这确实会阻止“保存提示”