【问题标题】:Worksheet becomes workbook element工作表成为工作簿元素
【发布时间】:2020-05-14 21:18:15
【问题描述】:

我有一个正在工作的 xlsm 文件 (Office 365)。我的宏做了很多事情,访问一些互联网页面,与 Access 数据库通信。我正在使用参考文献

VBA
Microsoft Excel 16.0 Object Library
OLE Automation
Microsoft Office 16.0 Object Library
Microsoft Scripting Runtime
Microsoft Internet Controls
Microsoft XML, v6.0
Microsoft Forms 2.0 Object Library
Microsoft ActiveX Data Object 2.8 Library
Also I am savinig my file on Onedrive folder.

问题是当我关闭文件并重新打开它时,会弹出一条消息说“我们发现'xxxxxxxx.xlsm'中的某些内容有问题。

您希望我们尽可能多地恢复吗?如果你相信 此工作簿的来源,请单击是。”

我单击“是”,控制开发人员对象从工作表(按钮)中消失,真正的问题是,当我打开 VBA 时,其中一个工作表变成了工作簿对象,并创建了一个内部没有代码的新工作表。

工作表变成了工作簿

我不知道可能是与引用冲突还是与 onedrive 服务器冲突。有人遇到过类似的问题吗?

编辑:我试图将所有代码复制到一个新的工作簿中,没有任何区别。重新打开文件时似乎已损坏,工作表转换为工作簿并创建了新工作表。

【问题讨论】:

  • 我偶尔会看到这种情况:一旦发生,就无法恢复工作簿(至少根据我的经验) - 它已经以某种方式损坏。最好的办法是将所有代码和工作表复制到一个新文件中。
  • 我试过但没用
  • 如果这是在 onedrive 中,我认为您可以返回到损坏之前的版本?如果您可以恢复它,那么我将使用 .xlsb 格式:这似乎更可靠。 support.office.com/en-us/article/…
  • 我做到了,但每次我执行它都会被卡住。正如我在帖子中分享的那样,我可以找到代码损坏文件的地方。谢谢

标签: excel vba corrupt


【解决方案1】:

经过大量调试后,我想我找到了错误。真正的问题是当我尝试在范围中添加验证时。

With Sheets(H_CARGA).Range(rngInt & "," & strRango).Validation
        .Delete
        If strLst = "" Then
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                xlBetween, Formula1:="A111,A112,B1,A0113,A0114,A0115,A0119,A0121,A0122,A0123,A0124,A0125,A0126,A0127,A0128,A0129,A0130,A0141,A0142,A0143,A0144,A0145,A0149,A150,A0161,A0162,A0163,A0164,A0170,A0210,A0220,A0230,A0240,A0311,A0312,A0321,A0322"
        Else
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                xlBetween, Formula1:=strLst
        End If
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = title
        .ErrorTitle = title
        .InputMessage = msgV
        .ErrorMessage = msgEr
        .ShowInput = True
        .ShowError = True
    End With

因此,显然正在发生两件事。 首先,范围。如您所见,这是一个组合范围。我用逗号“,”合并范围。当我从 Excel 执行它时,它完成得很好。当我从 VBA 执行它时,出现了一个关于用于合并它们的字符的错误。显然分号是正确的。 其次,我用作验证规则的列表类似于“A115,A456,A54,B556”,它们是与单元格引用非常相似的字符串。所以我猜在某个时候,当范围由逗号组成和分隔并且验证列表类似于单元格引用列表时,在文件保存的某个时候,它会混淆范围,文件的解释器在某个时候得到疯狂并遵循 sintax 规则结束创建新的工作簿元素和工作表。 我 100% 确定文件已损坏。我不知道这是否值得报告或需要检查。 我的解决方案是确保 Range 中的合并字符是分号而不是逗号。

还是谢谢

编辑>

我试图在我的项目之外重现错误,我可以。我用一个非常简单的代码开始了一个新的工作簿。在 Sheet1.cells(1,1) 中,我存储了验证列表

0;A;A01;A011;A0111;A0112;A0113;A0114;A0115;A0119;A012;A0121;A0122;A0123;A0124;A0125;A0126;A0127;A0128;A0129;A013;A01430;A014; ;A0142;A0143;A0144;A0145;A0149;A015;A0150;A016;A0161;A0162;A0163;A0164;A017;A0170;A02;A0210;A0220;A0230;A0240;A03;A03121;A0310A3; ;A0322;B;B05;B0510;B0520;B06;B0610;B0620;B07;B071;B0710;B072;B0721;B0722;B0723;B0729;B08;B081;B0811;B0812;B082;B0821;B089;B089 ;B0899;B09;B091;B0910;B099;B0990

然后我运行一个非常简单的例程

Sub testBug()
   With Sheet1.Range("N1:N100").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                xlBetween, Formula1:=Sheet1.Cells(1,1).Value
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = "title"
        .ErrorTitle = "title"
        .InputMessage = "msgV"
        .ErrorMessage = "msgEr"
        .ShowInput = True
        .ShowError = True
    End With
End Sub

当您运行此程序时,验证规则将应用于单元格。您关闭文档并重新打开它,它已损坏。很有趣。

【讨论】:

    【解决方案2】:

    在我的情况下,当我打开我的 xlsm 工作簿而另一个宏工作簿保持打开状态时会出现问题。然后包含分组 ActiveX 控件的工作表成为工作簿元素。

    我没有保存就关闭了工作簿。 取消组合该工作表上的 ActiveX 控件解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 2022-12-24
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多