【问题标题】:Renaming a sheet code name through VBA code (Not through properties)通过 VBA 代码重命名工作表代码名称(不是通过属性)
【发布时间】:2015-04-15 09:19:28
【问题描述】:

我有一个受保护的工作簿 A 供用户使用,它不允许用户从另一个工作簿 B 复制工作表。在工作簿 A 中,我考虑工作表 1-19(目前只有 13 个工作表,我允许将来使用 19 个工作表工作簿的扩展)作为“系统工作表”,不能删除或修改。表 20-30 是“非系统表”,用户可以根据需要在其中删除和修改。

我希望有一个导入功能,用户可以将包含 1 个工作表的工作簿 B 导入工作簿 A。工作簿 A 将检查当前存在多少“非系统工作表”并将新工作表插入到以 20+ 的工作表编号结束。例如:

Total sheets in workbook A = 18

Total "system sheets" in A = 13 (sheet 1-sheet 13)

Total "non system sheets" in A = 5 (sheet 20-sheet 24)

如果我要导入新的工作表工作簿 A 会将其分配为工作表 25

我希望 VBA 更改代码名称(工作表编号)而不是工作表的名称。

我已经尝试过寻找方法,有人可以为我指出正确的方向吗?谢谢!

【问题讨论】:

  • 您能否预先填充所有 19 个“系统”工作表并在它们上使用 xlVeryHidden 直到需要它们?
  • 是的,我想这是可能的。我也不想夸大文件大小。
  • 空工作表不会显着增加大小,并且可以预先编写工作表代码表。如果确实需要考虑大小,请将其保存为 XLSB 而不是 XLSM。

标签: vba excel


【解决方案1】:

在 Excel 对象模型中,工作表有 2 个不同的名称属性:

工作表.名称 Worksheet.CodeName

Name 属性是读/写的,包含出现在工作表选项卡上的名称。它是用户和 VBA 可变的

CodeName 属性是只读的

您可以将特定工作表引用为 Worksheets("Data").Range("A1"),其中 Data 是 .Name 属性,也可以引用为 Sheet1.Range("A1"),其中 Sheet1 是工作表的代号。

编辑: 您可以通过访问 VBA 项目模型组件扩展性来更改 CodeName 属性。

ThisWorkbook.VBProject.VBComponents(Sheets("Sheetname").CodeName).Name = "Sheet" & Workbook.Sheets.Count

请务必以编程方式访问 Visual Basic 项目。

文件 -> 选项 -> 信任中心 -> 信任中心设置 -> 宏设置 -> 信任对 VBA 项目对象模型的访问。

【讨论】:

    【解决方案2】:

    在您的具体示例中,您可以在用户将工作簿 B 中的 CodeName 导入到 Workbook A 之前修改它 - 因为如果您将工作表复制到另一个工作簿,它会保留其 CodeName。否则,您必须修改 VBProject 本身,例如:

    <Workbook>.VBProject.VBComponents(<Workbook>.Sheets(<SheetName>).CodeName).Properties("_Codename").value = <CodeName>
    

    我想出了(并测试)了一个稍微不同的情况下的复制解决方案,我将工作表复制到其中的工作簿有其 VBAProject 密码保护,这意味着上面的代码会抛出:

    50289 : Can't perform operation since the project is protected.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-23
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      相关资源
      最近更新 更多