在Excel VBA中,如何引用包含单引号的命名列

我正在调查Excel电子表格中的一个错误,其中以下公式插入到列中的每个单元格中。

=AGGREGATE( 3, 5, InputData[@[Foo]:[Bar]]) > 0 

VBA如下:

 Let AddColumn.DataBodyRange.formula = "=AGGREGATE( 3, 5, [@[Foo]:[Bar]]) > 0" 

如果列FooBar之间的当前行上的所有单元都为空,则这将评估为FALSE ,否则评估为TRUE

我看到的问题是名称FooBar是可变的,不在我的控制下,如果名称包含单引号,则公式会失败,并显示运行时错误1004:

 Let AddColumn.DataBodyRange.formula = "=AGGREGATE( 3, 5, [@[Foo's name]:[Bar]]) > 0" 

有没有一种方法,我可以逃避这样的名字,单引号不会创build运行时错误? 在名称周围添加双引号给了我相同的错误。

如果名称包含Excel中具有特殊含义的其他字符,是否可能还有其他问题?

我也可以通过地址而不是名称来引用列。 这将工作与当前行'@'符号?

Excel版本:14.0.7188.5002

当你说命名约定是“不在我的控制下”的时候,我听到你的声音。 当任何东西都可以被抽入你的代码时,这真的使你陷入困境。

可悲的是,唯一的解决办法是在他们最终交给你的时候清理input。 这涉及到你必须创build你自己的vba函数,它接受一个string,并返回一个被删除了特殊字符的string(或者被别的东西replace)。

在你的情况下,你将不得不在两个地方擦洗数据。

首先,你将需要改变所有的列名,所以他们没有特殊的字符。 您需要访问每个名称并通过“擦洗”function发送,然后用擦掉的名称replace名称。

其次,当有人为你的AGGREGATEinput一个列名时,你需要将这个input捕获到一个stringvariables中,然后通过'scrub'函数传递它。 然后你需要validation他们给你的input与一个有效的列名匹配。 如果无效,则向他们发送错误消息,要求他们input有效的姓名或取消。

为foo和bar提供了有效的值之后,可以将它们添加到AGGREGATE函数并让它执行。

如果无法清理/更改列名称,则必须列出清理的列名称并将其与列地址相关联。 然后,当你得到你的input,擦洗它,然后匹配到列表来获取正确的地址。 那么你可以使用硬地址而不是variables命名scheme。

这是很多工作。 但是,当您命名不受您控制的约定时,这是必要的。

其他答案和评论使我走上正轨:

 Function escapedColumnName(columnName As String) As String columnName = Replace(columnName, "'", "''") columnName = Replace(columnName, "#", "'#") columnName = Replace(columnName, "[", "'[") columnName = Replace(columnName, "]", "']") escapedColumnName = columnName End Function