尝试删除数组VBA中的元素时出现错误424

时间:2019-06-26 02:19:24

标签: arrays excel vba

当某些条件为真时,我试图删除数组vba中的特定元素,但最终出现错误424。我是否知道正确的方法?我厌倦了使用redim,但是它不适合我的情况,因为在与其他数组进行比较之后,我需要将数据存储回excel文件中,而excel文件中的位置已经进行了排序。

在将remarkRange更改为数组变体之前,我将其用作 Dim remarkRange  作为范围,我可以在其中使用。清除清除特定元素中的范围项。

我尝试了remarkRange(I, 1)=" ",它可以正常运行,但不确定是否合适。我可以知道正确的方法吗?谢谢。

Dim remarkRange() As Variant
remarkRange= wb.Sheets("wb").Range("A1:A5").Value2 

For I = LBound(remarkRange) To UBound(remarkRange)
   If (some condition is true) then
       remarkRange(I, 1).Delete
   End If
Next I

我希望数组中特定单元格中的元素为空,但出现错误424

2 个答案:

答案 0 :(得分:0)

数组没有Delete方法。当Range是数组而不是remarkRange时,在Range中包含remarks也会引起误解。也许是其他名称,例如For i = LBound(remarks, 1) To UBound(remarks, 1) If some condition Then remarks(i, 1) = "" End If Next i 或任何您可以理解的东西。

如果您要将数组写回到工作表中,那么将元素更改为空白字符串就没有问题。

       for(int i=1;i<=num;i++){
            for(int j=1;j<=i;j++){
                System.out.print(" "+i+" ");
            }
        } 

答案 1 :(得分:0)

似乎您需要确定“删除”的含义。我不知道变量数组的Delete属性,因此虽然您的代码可能会编译,但会抛出对象必需的错误。

但是,关于先前在Clear对象上使用Range方法的观点建议您只想将范围值读入数组,如果不是某些条件,则删除内容,然后将数组重新写入该范围。如果是这种情况,您可能不希望调整数组的大小,因为行或列不会对齐-更常见的是,您将变量数组的项目设置为Empty

下面的代码显示了如何通过一个简单的例程来执行此操作,该例程从A列中提取10个数字,删除所有奇数,然后将数字重新写入C列-但行仍匹配:

Public Sub EmptyItemsAndKeepArraySize()
    Dim inArr() As Variant
    Dim i As Long

    'Read range into arrays.
    inArr = Sheet1.Range("A1:A10").Value2

    'Clear all numbers that are not even.
    For i = 1 To UBound(inArr, 1)
        If inArr(i, 1) Mod 2 <> 0 Then inArr(i, 1) = Empty
    Next

    'Write cleared array to column C
    Sheet1.Range("c1").Resize(UBound(inArr, 1)).Value = inArr
End Sub

但是,如果您确实要删除数组并调整其大小,那么一种简单的方法是先填充一个临时集合,然后调整输出数组的大小,然后再使用集合项来填充它。在下面的示例中,代码删除了所有奇数,然后将数组写入B列-但数组的大小减小了(即,连续的行):

Public Sub DeleteItemsAndShrinkArray()
    Dim inArr() As Variant, outArr() As Variant
    Dim i As Long
    Dim temp As Collection
    Dim v As Variant

    'Read range into arrays.
    inArr = Sheet1.Range("A1:A10").Value2

    'Keep all even numbers in a temporary collection.
    Set temp = New Collection
    For i = 1 To UBound(inArr, 1)
        If inArr(i, 1) Mod 2 = 0 Then temp.Add inArr(i, 1)
    Next

    'Dimension the output array.
    ReDim outArr(1 To temp.Count, 1 To 1)

    'Populate new array from temp collection.
    i = 1
    For Each v In temp
        outArr(i, 1) = v
        i = i + 1
    Next

    'Write reduced array to column B
    Sheet1.Range("B1").Resize(UBound(outArr, 1)).Value = outArr

End Sub