首页 > 解决方案 > 与笔记本电脑相比,在 Surface 平板电脑上运行时获得不同的结果

问题描述

我目前正在 Core i7 笔记本电脑上开发我的 Excel 工作簿。我已将我的 Excel 文件发送给 MS Surface 平板电脑上的同事。这些同事在 Surfaces 上得到了不同的行为。

步骤是:打开 Excel 文件,切换到选项卡并向我发送以%appdata%.

有问题的选项卡具有以下代码:

Option Explicit

Private Sub Worksheet_Activate()

    If p Is Nothing Then Set p = New Projects
    p.validateSheet

End Sub

Private Sub Worksheet_Change(ByVal target As Excel.Range)

    If p Is Nothing Then Set p = New Projects
    p.updateSheet target
    
End Sub

本质上,从我的日志文件中,当笔记本电脑切换到它调用的选项卡时Worksheet_Activate。但是,Surface 正在调用Worksheet_Change工作表中的每一行和单元格。

我已经确认,Office 版本在这两种情况下都是相同的。

任何想法为什么会发生这种情况?

编辑#1

返回的部分日志。注意 updateSheet 的“开始”和“结束”,以及范围的变化。

2020-10-13 9:53:08 AM: Starting updateSheet.
2020-10-13 9:53:08 AM: Range: $D$2
2020-10-13 9:53:08 AM: 0001
2020-10-13 9:53:08 AM: Reset credentialWindowCancelled.
2020-10-13 9:53:08 AM: Ending updateSheet.
2020-10-13 9:53:08 AM: Starting updateSheet.
2020-10-13 9:53:08 AM: Range: $E$2
2020-10-13 9:53:08 AM: 0001
2020-10-13 9:53:08 AM: Reset credentialWindowCancelled.
2020-10-13 9:53:08 AM: Ending updateSheet.
2020-10-13 9:53:08 AM: Starting updateSheet.
2020-10-13 9:53:08 AM: Range: $F$2
2020-10-13 9:53:08 AM: 0001
2020-10-13 9:53:08 AM: Reset credentialWindowCancelled.
2020-10-13 9:53:08 AM: Ending updateSheet.
2020-10-13 9:53:08 AM: Starting updateSheet.
2020-10-13 9:53:08 AM: Range: $G$2
2020-10-13 9:53:08 AM: 0001
2020-10-13 9:53:08 AM: Reset credentialWindowCancelled.
2020-10-13 9:53:08 AM: Ending updateSheet.
2020-10-13 9:53:08 AM: Starting updateSheet.
2020-10-13 9:53:08 AM: Range: $H$2
2020-10-13 9:53:08 AM: 0001
2020-10-13 9:53:08 AM: Reset credentialWindowCancelled.
2020-10-13 9:53:08 AM: Ending updateSheet.

编辑#2

如何pThisWorkbook代码中初始化:

Private Sub Workbook_Open()
    ...
    Set p = New Projects
    ...
End Sub

更新#1

以下代码在我同事的平板电脑上运行,一直显示 Worksheet_Activate...

Option Explicit

Private Sub Worksheet_Activate()

    Debug.Print Now() & ": " & "Worksheet_Activate"

End Sub

Private Sub Worksheet_Change(ByVal target As Excel.Range)

    Debug.Print Now() & ": " & "Worksheet_Change"

End Sub

我回到我的日志并发现了这个(截断以说明我的观点)

2020-10-13 12:51:06 PM: Starting validateSheet.
2020-10-13 12:51:06 PM: Starting FetchIdentification
2020-10-13 12:51:06 PM: Starting sendBitsRequest
...
2020-10-13 12:51:21 PM: Ending sendBitsRequest
2020-10-13 12:51:22 PM: Starting updateSheet.
...
2020-10-13 12:51:35 PM: Ending validateSheet.

注意"Starting validateSheet"调用 fromWorksheet_Activate"Starting updateSheet"调用 from Worksheet_Change。附近也没有“结束验证表”。

似乎有一个从Worksheet_ActivateWorksheet_Change...的过渡

另请注意,只有我的机器似乎可以正确运行此代码。我能够在平板电脑和其他笔记本电脑上进行复制。所以,显然都在我身上。

p正在位于 Modules 下的文件中进行初始化。但是,它没有在任何地方实例化:

Public p As New Projects

标签: excelvba

解决方案


在平板电脑上,我遇到on error goto了错误。该错误与使用和实例化时实例化的不同浏览器有关HTMLDocument

我的机器:

compatMode: BackCompat
documentMode: 11

其他机器:

compatMode: BackCompat
documentMode: 5

我最终使用了一个InternetExplorer对象而不是MSHTML.

此处的解决方案:使用 MSHTML.HTMLDocument 时强制使用 documentMode


推荐阅读