我有一个 xlsm 工作簿,它根据与相邻工作表的比较来为单元格背景着色。无论插入还是删除工作表,相邻项始终为左侧 1。这个过程有点复杂,但这是我能找到的最简单的方法。
基本上,单元格会将自身与上一张工作表上相同位置的单元格进行比较,如果相同,则格式不变,如果不同,则突出显示单元格。唯一的 VBA 位于命名范围内。'sheetnames' '=GET.WORKBOOK(1)&T(NOW())'
它似乎返回一个包含所有工作表名称的长字符串。
与前一张表进行比较的条件是:
=INDIRECT(ADDRESS(ROW(),COLUMN(),4,1,INDEX(MID(sheetnames, FIND("]",sheetnames)+1,255), SHEET()-1))) <>INDIRECT(ADDRESS(ROW(),COLUMN(),4,1,))
这将使用引用的“sheetnames”并提取前一张表的名称,并使用它作为间接地址生成器。
格式在屏幕上完美显示,但在打印预览、实体打印或 PDF 导出中均未显示。您知道为什么会出现这种情况吗?
此外,如果有更简单的方法来处理相邻的工作表,我会欢迎提供意见。
答案1
问题出在公式中,即 的使用SHEET()
。正如所用,括号内未指定任何工作表,因此使用 Excel 惯例(例如,通常使用CELL
),即使用当前选定的单元格作为评估“相对于”函数的单元格。
这似乎会导致循环引用。在较旧的 Excel 功能中,这样的公式将计算一次,并且永远不会再计算,或者如果计算,将给出循环引用错误。因此,在为屏幕呈现条件格式时,它会很好地进行计算,但是当打印(显然)要求在打印之前对所有内容进行计算时,它会失败,因此条件格式会在打印的下游过程中丢失,直到打印工作完成。
这确实要求打印功能发出的任何此类请求都不会改变电子表格或其呈现的显示,而只是打印对其试图打印的材料的使用,并在完成工作后将其丢弃。但这似乎并非不可能。
指定您所在的工作表,这似乎不是一个不可能完成的繁琐工作...不可否认,这是一项繁琐的工作,但即使您有 200 个标签,也不是一件繁琐的工作,而且该公式可以很好地满足条件格式和打印的要求。
另一个可能导致悲伤的考虑因素是,公式的计划仅当包含公式的单元格是当前选定的单元格时才有效。选择其他单元格,虽然它似乎有效,但实际上并非如此。任何看似有效的方面都是纯粹的巧合,因为您比较的不是预期的单元格,而是完全不同的一对。就像墙上的钟面和指针的绘画一样,它不是时钟,也不是“嗯,呃,每天两次,伙计”,因为它不是时钟。我也是一样。
只需对公式进行简单的编辑即可SHEET("sheet2")
解决问题。
因此,最终归结为必须完全重新设计如何实现比较,这需要一定量的工作,而且如果没有 VBA 可能几乎不可能(可能不是,但也许),而修改公式则需要一定量的工作。
至于这一点,可以将公式形成为文本字符串,使用SHEET()
字符串中的输出,然后复制、粘贴为值,并在公式编辑器中复制,然后将复制的字符串作为公式粘贴到所需的单元格中,如果需要,可以在多个单元格中复制和粘贴该字符串(因为它的寻址不可知)。甚至可以在命名范围内执行此操作。无论如何,甚至不需要在括号之间单击并粘贴或键入当前工作表名称。
最后,明确地说,VBA(Excel 4 宏命令,但现在算作 VBA)在这里没有任何问题。问题只是通过使用SHEET
不带参数的函数而产生的循环。