excel - Excel VBS 中 ActiveSheet.Range.Value 的简单 =IF 语句触发 1004 运行时错误
问题描述
得到以下代码,它可以作为 Excel VBScript 宏工作:
Sub replace()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
Sheets(ws.Name).Activate
Dim I
For I = 5 To 20
ActiveSheet.Range("T" & I).Value = "=AVERAGE(3)"
Next I
Next ws
End Sub
显然=AVERAGE(3)
不是为了以任何方式有用,而是为了表明上面的代码有效,而下面的代码块没有:
Sub replace()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
Sheets(ws.Name).Activate
Dim I
For I = 5 To 20
ActiveSheet.Range("T" & I).Value = "=IF(1=1;1;0)"
Next I
Next ws
End Sub
实际上应该有一个更复杂的公式,其中IF
is (看起来像:=IF(Q5<>0;IF(R5+S5>Q5;"ERROR";IF(R5="";S5/Q5;IF(Q5=R5;"Coord.";S5/(Q5-R5))));"N/A")
.
问题是,我缩小了范围,直到我看到即使是那个微不足道=IF(1=1;1;0)
的语句也因 1004 运行时错误而失败。
我认为解决这个问题并不重要,但整个宏只是为了更新每个工作表上的大约 15 个单元格,大约 31 个工作表。正如我所说,第一个块有效(通过AVERAGE()
计算)但=IF
不起作用。
为了完整起见,这是我想要的代码:
Sub updCells()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
Sheets(ws.Name).Activate
Dim I
For I = 5 To 20
ActiveSheet.Range("T" & I).Value = "=IF(Q" & I & "<>0,IF(R" & I & "+S" & I & ">Q" & I & ",""ERROR"",IF(R" & I & "="""",S" & I & "/Q" & I & ",IF(Q" & I & "=R" & I & ",""Coord."",S" & I & "/(Q" & I & "-R" & I & ")))),""N/A"")"
Next I
Next ws
End Sub
解决方案
除了不需要激活工作表的注释之外,您的代码可以简化为以下代码。看看如何避免 select。
这通常也适用于更复杂的公式(例如您的示例) - Excel 将计算出相对引用。
Sub replace()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
ws.Range("T5:T20").Formula = "=IF(1=1,1,0)"
Next ws
End Sub
推荐阅读
- python - 按需将列表保存为 JSON
- c# - XSD:如何重新定义基本模式的标签
- ios - NSKeyedUnarchiver 总是返回 nil
- pandas - 将 170 万条数据从雪花提取到 csv 文件时出错
- reactjs - 如何让组件的道具更漂亮地保持在一行?
- java - 演员表
从 Dart 到 Java HashMap 的有效负载 - powershell - 在 powershell 脚本中解释 AWS CLI 输出
- antlr - 匹配带有空格的单词作为一个标记,但不允许某些关键字标记
- adtf - 将 qt 与 adtf 一起使用。在构建期间生成moc文件?
- haskell - 在不编译源代码的情况下构建 Haddock 文档