【发布时间】:2021-08-23 22:22:39
【问题描述】:
这是一个小众问题,因为通常 最好保护工作表,但我认为在某些情况下您只需要保护单元格的内容以避免意外通过保护工作表进行编辑和删除而不限制工作表整体的可编辑性,例如创建新过滤器。
我的问题:
我需要通过脚本将 Revit 计划导出到 Excel 电子表格进行编辑,然后再导入到 Revit。这是因为编辑元素,尤其是房间,可能会对我们的项目规模造成负担,并且缺乏直观、快速的方式来排序和替换 Revit 计划中的内容。我创建了一个宏,它将 Excel 文件的完整路径(共享网络驱动器的 UNC 路径)保存到配置文件中,以基本上将计划“链接”到该 Excel 文件。如果在配置文件中找不到excel文件,那么我用OpenFileDialog()和CheckFileExists = false创建一个,这样就出现了问题。
如果我创建一个新的 Excel 文件并在保存文件时使用 Microsoft.Office.Interop.Excel 方法 sheet.Protect("password"),导出到新创建的文件的用户需要知道在哪里查看宏以解锁工作表以执行受保护工作表不允许的某些设置。这也将允许他们有目的地或以其他方式更改任何受保护的数据,并损害数据的有效性。更糟糕的是,如果/当我有时间将其变成 Revit 的更高级插件而不是宏时,使用的密码将被隐藏,甚至不允许更值得信赖的高级用户设置工作表。如果我允许用户在创建新 Excel 文件时设置密码,那么他们可以随时解锁。
需求:
使用此脚本导出的数据除了包含在 Revit 计划中的内容之外,还包含 Revit 元素的 ElementId,这是将 Excel 数据以 100% 准确度绑定回 Revit 元素所必需的(这是唯一唯一的元素存在时不改变的元素的属性)。如果以在 Excel 文件中创建重复值的方式进行更改,则导入的有效性将被破坏,并且必须进行回滚(此错误越久未被注意到,其严重性就会增加)。
简单地隐藏 ElmentId 列并不能阻止用户取消隐藏它,并且 Protect Sheet 不允许在创建新的 Excel 文件时对工作表进行少量必要的更改。
因此,我需要“防止”意外更改 ElementId 列,但仍允许更改 Protect Sheet 不允许的一小部分功能。
再次,我意识到这是非常利基的需求,通常不是保护数据的理想限制。我也意识到这对保护行的删除没有任何作用,就像保护表一样。也就是说,我的目标是防止将 Excel 中的 ElementId 值更改为另一个有效的 ElementId 值,仅此而已。因此,删除行仅意味着与该特定 ElementId 关联的 Revit 元素在导入数据时不会收到任何形式的更新,因为单元格要么为 null,要么被跳过,要么包含无效的 ElementId,不能关联到现有元素,从而保护所述元素数据的有效性。
【问题讨论】:
-
所以有一个数据表然后使用可以在vba中设置的“非常隐藏”选项...
-
此设置是否也可以通过 C# 通过 Interop 库进行设置,或者仅通过内部 VBA 宏进行设置?如果是后者,有没有办法通过互操作库运行/触发它?如果这可以自动化,这将允许我做一些其他的事情来简化处理,但我不熟悉通过互操作直接从/向单元读取/写入之外的任何内容。否则,我想我可以创建一个包含该类型工作表的模板文件,并让我的宏使用它而不是打开一个空白文件。
-
您是否已经检查了 vba 中非常隐藏的选项?然后你可能会看看你是否可以使用 C#...
-
是的。我以前用过它,但由于缺乏它,忘记了它。我查看了 Excel.Interop 文档,可见性是一个暴露的属性,它有三个选项,包括
xlSheetVeryHidden。不过,你会在这个隐藏的数据表上放什么?我认为 ElementId 会以前所未有的方式使行删除成为一个问题。我知道有一个宏可以防止这种情况发生,但这需要一个 .xlsm 文件,我相信可以禁用该宏...