2017-09-15 875 views
1

我正在调查Excel电子表格中的一个错误,其中以下公式插入到列中的每个单元格中。在Excel VBA中,如何引用包含单引号的命名列

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

的VBA如下:

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

这将评估为FALSE如果所有列FooBar之间的当前行的细胞是空的,否则结果为TRUE

我看到的问题是名称FooBar是可变的,不在我的控制之下,并且公式因运行时错误而失败1004号,如果名称中包含一个单引号:

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

有没有一种方法,我可以以这样的方式是单引号不会造成运行时错误逃脱的名字吗?在名称周围添加双引号会导致同样的错误。

如果名称中包含其他字符在Excel中有特殊含义,是否可能会有进一步的问题?

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

Excel版本:14.0.7188.5002

+0

前缀列名的任何特殊字符的撇号。据我所知,这将包括字符:'#@ []' – Rory

回答

0

我听到你时,你说的命名规则是“不归我管”。当任何东西都可以被抽入你的代码时,这真的会让你陷入困境。

不幸的是,唯一的解决方案是在他们最终把它交给你的时候擦除输入。这涉及到你必须创建你自己的vba函数,它接受一个字符串并返回一个删除了特殊字符的字符串(或者用别的东西替换掉)。

就你而言,你将不得不在两个地方擦洗数据。

首先,您需要更改所有列名称,以便它们中没有特殊字符。您需要访问每个名称并通过'scrub'函数发送它,然后用擦掉的名称替换名称。其次,当有人为你的AGGREGATE输入一个列名时,你需要将该输入捕获到一个字符串变量中,然后通过'scrub'函数传递它。然后你需要验证他们给你的输入与一个有效的列名匹配。如果无效,请向他们发送错误消息,要求他们输入有效的姓名或取消。

当您具有foo和bar的有效值后,可以将它们添加到您的AGGREGATE函数中并让它执行。

如果您无法清理/更改列名称,那么您必须创建清理列名称列表并将它们与列地址相关联。然后当你得到你的输入时,擦洗它,然后匹配到列表以获取正确的地址。然后你可以使用硬地址而不是变量命名方案。

这是很多工作。但是,当你命名不受你控制的惯例时,这是必要的。

0

其他的答案和评论让我在正确的轨道上:

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

    escapedColumnName = columnName 
End Function 
相关问题