Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel-在VBA中使用结构化名称创建公式会导致某些列名获得“0”@&引用;(同一列)标签?_Excel_Vba_Formula - Fatal编程技术网

Excel-在VBA中使用结构化名称创建公式会导致某些列名获得“0”@&引用;(同一列)标签?

Excel-在VBA中使用结构化名称创建公式会导致某些列名获得“0”@&引用;(同一列)标签?,excel,vba,formula,Excel,Vba,Formula,我被难住了,希望能找到这个奇怪问题的答案 在我的VBA代码中,我正在创建一个公式,用于访问表中名为“代理”的列。(待定CSV导入值[代理])。代理列在我的工作表的第8列。表有时会被创建/删除,并且可以有不同的行数。删除表后,我重新创建它,然后运行VBA代码重写公式。对于其他公式,这很好。但是 当我使用下面的代码将公式填充到单元格F3中时,它会在两个“代理”列引用中添加“@”。我看不出有什么原因。但奇怪的是,它只留下了3个代理引用中的一个。(见下文) 我的VBA: ActiveSheet.Ra

我被难住了,希望能找到这个奇怪问题的答案

在我的VBA代码中,我正在创建一个公式,用于访问表中名为“代理”的列。(待定CSV导入值[代理])。代理列在我的工作表的第8列。表有时会被创建/删除,并且可以有不同的行数。删除表后,我重新创建它,然后运行VBA代码重写公式。对于其他公式,这很好。但是

当我使用下面的代码将公式填充到单元格F3中时,它会在两个“代理”列引用中添加“@”。我看不出有什么原因。但奇怪的是,它只留下了3个代理引用中的一个。(见下文)

我的VBA:

  ActiveSheet.Range("F3").Formula = "= ""Number of Agents:   "" & SUM(IF(tbl_CSV_Import_Values[Agent]<>"""",1/COUNTIF(tbl_CSV_Import_Values[Agent], tbl_CSV_Import_Values[Agent]), 0))"
ActiveSheet.Range(“F3”).Formula=“=”代理数量:“&SUM(如果(tbl\U CSV\U导入值[代理]”),1/COUNTIF(tbl\U CSV\U导入值[代理]、tbl\U CSV\U导入值[代理]),0))”
获取位于单元格F3中的公式(由于代理前面的“@”而生成错误:

= "Number of Agents:   " & SUM(IF(tbl_CSV_Import_Values[@Agent]<>"",1/COUNTIF(tbl_CSV_Import_Values[Agent], tbl_CSV_Import_Values[@Agent]), 0))
=“代理数量:”&SUM(如果(tbl_CSV_导入值[@Agent]),1/COUNTIF(tbl_CSV_导入值[Agent],tbl_CSV_导入值[@Agent]),0))
当然,公式失败了……除非我只是手动从公式中删除那些“@”符号。(excel错误显示“公式中使用的值是错误的数据类型”。)删除这两个@后,公式立即工作正常

有人知道为什么Excel决定这样攻击我的列引用(而且只有3个中的2个?!),我能做些什么来阻止它吗


-Daniel

如果
If
中的第一个参数(
If(tbl_CSV_导入值[代理]“”,…
)和
COUNTIF
中的第二个参数(
COUNTIF(…,tbl_CSV_导入值[代理])
)应是一个单元格范围的引用,而不是单个单元格,则公式必须是数组公式。因此,在以前的
Excel
版本中,必须通过按Ctrl+Shift+Enter将公式作为数组公式应用

由于
Excel 365
尝试自动选择是否使用数组公式。但是当使用
Range.formula
通过
VBA
设置时,它总是设置一个普通公式而不是数组公式。在普通公式中,
IF
中的第一个参数和
COUNTIF
中的第二个参数不能是c列引用,但必须是对单个单元格的引用。这就是添加
@
的原因

要避免这种情况,请使用
VBA
显式设置数组公式:

ActiveSheet.Range("F3").FormulaArray = "= ""Number of Agents:   "" & SUM(IF(tbl_CSV_Import_Values[Agent]<>"""",1/COUNTIF(tbl_CSV_Import_Values[Agent], tbl_CSV_Import_Values[Agent]), 0))"
ActiveSheet.Range(“F3”).FormulaArray=“=”代理数量:“&SUM(如果(tbl\U CSV\U导入值[Agent]”,1/COUNTIF(tbl\U CSV\U导入值[Agent],tbl\U CSV\U导入值[Agent]),0))”

尝试将
.Formula
更改为
.Formula2
。结构化引用的缺点是没有$符号使引用成为绝对引用。相反,有@符号,目的基本相同。但由于结构化引用被认为比传统引用更易于使用,因此您无法选择。其效果是,如果结构化引用不符合您的要求,您就不应该使用它。应该是有帮助的。如果它符合要求,请告诉我,这样我们就可以将其标记为副本。是的,JvdV确实符合要求!非常抱歉,我在搜索中没有遇到这个问题--这是一个多么好的答案!非常感谢!(公式2正好满足了我的需要——我今天学到了一些东西!)@DanielBarrett,这很好。出于某种原因,很难找到“@”除了好的搜索词外,它还不容易显示。你好,Axel,Excel365为动态数组公式提供了一个新的标准。请参阅我不久前写的答案。@JvdV:是的,我知道。但这部分是另一个问题,因为这里没有使用新的动态数组函数。可能使用
范围。公式2
也会有所帮助。但是使用
Range.FormulaArray
将与
Range更向后兼容。Formula2
不能用于
Excel 2016
及更低版本。好的,如果向后兼容,我理解=)。