清除可能为空的动态范围

时间:2015-08-18 19:28:59

标签: excel-vba vba excel

如果我定义动态命名范围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

我想要一种更清晰的方式来查看命名区域是否存在,但是它是无效的。

2 个答案:

答案 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))