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

时间:2017-09-15 13:51:49

标签: excel vba excel-vba excel-formula

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

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

VBA如下:

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

如果FALSEFoo列之间当前行的所有单元格都为空,则评估为Bar,否则评估为TRUE

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

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

有没有办法可以以单引号不会产生运行时错误的方式转义名称?在名称周围添加双引号会给我带来同样的错误。

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

我也可以通过地址而不是名称来引用列。这是否适用于当前行'@'表示法?

Excel版本:14.0.7188.5002

2 个答案:

答案 0 :(得分:0)

当你说命名惯例“不在我的控制之下”时,我会听到你的声音。当任何东西都被输入你的代码时,这真的会让你陷入困境。

可悲的是,唯一的解决方案是在最终将输入交给您时清理输入。这涉及到您必须创建自己的vba函数,该函数接收一个字符串并返回一个删除了特殊字符的字符串(或替换为其他字符串)。

在您的情况下,您将不得不在两个地方清理数据。

首先,您需要更改所有列名,以便它们中没有特殊字符。您需要访问每个名称并通过“scrub”功能发送它,然后用刷新的名称替换名称。

其次,当有人为您的AGGREGATE输入列名时,您需要将该输入捕获到字符串变量中,然后通过'scrub'函数传递它。然后,您需要验证他们给您的输入是否与有效的列名匹配。如果它无效,请向他们发送错误消息,要求他们输入有效名称或取消。

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

如果无法清除/更改列名,则必须列出已清理的列名称并将其与列地址关联。然后,当您获得输入时,擦除它,然后匹配列表以获取正确的地址。然后,您可以使用硬地址而不是变量命名方案。

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

答案 1 :(得分:0)

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

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

    escapedColumnName = columnName
End Function