如果我定义动态命名范围Foo
,例如=OFFSET(sheet!$A$2,0,0,COUNTA(sheet!$A$2:$A$1048576 ),1)
,我可以从VBA中清除它:
Me.Range("Foo").Clear
但是,如果范围已经明确,则会失败。我可以用
解决这个问题On Error Resume Next 'If this reange is clear it errors out.
Me.Range("Foo").Clear
On Error GoTo 0
我想要一种更清晰的方式来查看命名区域是否存在,但是它是无效的。
答案 0 :(得分:2)
您可以像这样使用Evaluate
:
Sub test()
If TypeName(Evaluate("Foo")) = "Range" Then Evaluate("Foo").Clear
End Sub
如果你使用样本动态范围连续两次运行它,第一次清除数据时第二次正常地执行任何操作。
答案 1 :(得分:1)
你无法清除Foo的原因是Foo处于错误状态;例如它不存在。你的公式将Foo定义为没有单元格,如果它已被清除,并且命名范围可以存在于错误状态,则即使它具有至少一个值,即使该值是由a返回的零长度字符串,也不能引用它。式。简而言之,COUNTA function返回零,因此Foo为零行高一列宽。
即使该单元格为空,您也可以确保Foo至少有一行高。
public static String getField(json, errorsIndex, fieldIndex) {
JSONObject errorJson =json.getJSONArray("errors").getJSONObject(errorIndex);
String value = errorJson.[getTheListOfMyFields].get(fieldIndex);
return value;
}
如果您打算让Foo偶尔出现在错误状态并使用=OFFSET(sheet!$A$2, 0, 0, MAX(1, COUNTA(sheet!$A$2:$A$1048576 )), 1)
处理试图清除任何内容,那么这将是一个更好的公式。
On Error Resume Next
假设A列中有文本(您使用的是COUNTA,而不是COUNT)。如果有数字,那么
=Sheet!$A$2:INDEX(sheet!$A$2:$A$1048576, MATCH("zzz", $A$2:$A$1048576))