Ошибка 424 при попытке удалить элемент в массиве vba - PullRequest
0 голосов
/ 26 июня 2019

Я пытался удалить определенный элемент в массиве vba, когда определенные условия выполняются, но в итоге получаю ошибку 424. Могу ли я узнать, как это сделать правильно?Я устал использовать redim, однако он не подходит для моих условий, так как после сравнения с другим массивом мне нужно сохранить данные обратно в файл Excel, где местоположение в файле Excel уже отсортировано.

Перед изменениемв качестве примечания к варианту массива, я использовал его как DimmarkRange в качестве диапазона , где я могу просто использовать .Clear , чтобы очистить элемент диапазона в определенном элементе.

Iпробовал 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 голосов
/ 26 июня 2019

Кажется, вам нужно решить, что вы подразумеваете под словом «удалить».Мне неизвестно свойство Delete массива вариантов, поэтому, хотя ваш код может скомпилироваться, он выдаст ошибку, необходимую для объекта.

Тем не менее, ваша точка зрения о ранее использовавшемся методе Clear вRange объект, предполагает, что вы просто хотите прочитать значения диапазона в массив, удалить содержимое, если определенные условия не являются мной, а затем переписать ваш массив в диапазон.Если это так, вы, вероятно, не захотите изменять размер вашего массива, поскольку строки или столбцы не будут выстраиваться в ряд - чаще всего вы устанавливаете элемент вашего варианта массива на Empty.

Приведенный ниже код показывает, как сделать это в простой процедуре: взять 10 чисел из столбца A, удалить все нечетные числа и переписать числа в столбец 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
0 голосов
/ 26 июня 2019

Массив не имеет 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...