for each
цикл перебирает коллекции. У вас есть диапазон, называемый строкой запроса. У вас есть диапазон под названием c. То, что вы сделали, - это цикл через каждый RANGE в queryrow ... что означает, что c будет просто строкой запроса.
Вы хотите
for each c in queryrow.cells
Кроме того, следует помнить, что это примерно так же неэффективно, как это возможно, так как это происходит в цикле через все 65000 или около колонн, вместо того, чтобы просто сравнительно мало, что на самом деле есть данные.
EDIT: Я не уверен, почему это все еще вызывает у вас ошибку. Однако у вас есть другие логические ошибки. Это выполняется для меня (также, за любовь к добру, отступов!), Если я бросаю в некоторых данных из В2: H21, например:
Sub test()
Dim worksheetname As Worksheet
Set worksheetname = ActiveWorkbook.ActiveSheet
Dim queryaddress As Range
Dim notoffsetnum As Integer
Dim anotherarrayofnumbers() As Integer
Dim c As Range
For Each queryaddress In worksheetname.Range("B2:B21")
Dim queryrow As Range
Set queryrow = queryaddress.EntireRow
notoffsetnum = 0
For Each c In queryrow.Cells
If c.Interior.Color <> 192 And Not IsEmpty(c.Value) Then
notoffsetnum = notoffsetnum + 1
ReDim Preserve anotherarrayofnumbers(notoffsetnum)
anotherarrayofnumbers(notoffsetnum - 1) = c.Value
End If
Next c
Next queryaddress
Dim i As Integer
For i = 0 To UBound(anotherarrayofnumbers) - 1
Debug.Print anotherarrayofnumbers(i)
Next i
End Sub
Еще одна проблема, с которой было легко исправить, что будет по умолчанию , Массивы VBA основаны на 0. Они начинаются с 0, и вы ошибочно начинаете с 1. VBA не будет выкидывать ошибку, у нее будет только элемент 0 0. 0.
Ваша настоящая проблема в том, что после каждой строки вы выбиваете старый массив потому что notoffsetnum возвращается к 0, а затем вы удаляете массив обратно до размера 1. Это отбрасывает все, и в конце вы только что получили последнюю строку. Я ПРИНИМАЮ, что это ошибка. Поскольку это что-то очень много, вот что-то, что я считаю немного чище и немного менее хрупким. Единственное предположение, которое я делаю, это то, что вы начинаете с B2, и что у вас есть данные, идущие как вниз, так и вправо. Если это когда-нибудь будет проблемой, вы можете немного ее изменить. Я просто думаю, что вы найдете методы range.end (xl ...) lifesaver. Это займет у вас ячейку, которую вы получите, если вы нажмете клавишу Ctrl + стрелка, так что это быстрый способ разделить края диапазонов.
Sub BetterSolution()
Dim ws As Worksheet
Set ws = ActiveWorkbook.ActiveSheet
Dim firstCell As Range
Set firstCell = ws.Range("B2")
Dim lastCol As Integer
lastCol = firstCell.End(xlToRight).Column
Dim lastRow As Integer
lastRow = firstCell.End(xlDown).Row
Dim lastCell As Range
Set lastCell = ws.Cells(lastRow, lastCol)
Dim arr() As Integer
Dim rng As Range
Dim index As Integer
index = 0
For Each rng In ws.Range(firstCell, lastCell).Cells
index = index + 1
ReDim Preserve arr(index + 1)
arr(index) = rng.Value
Next rng
End Sub
Выполняют ли все непустые ячейки, которые вы зацикливаете, целые значения? Используйте окно Immediate для проверки значения notoffsetnum при возникновении ошибки, а затем посмотрите на значение в соответствующей ячейке – barrowc
@barrowc. Это была проблема, у меня не было целочисленных значений для одного из 'c.Value'. Фильтрация этого одного значения закончила ошибку. –