2015-07-19 2 views
0

Я прохожу через ряд ячеек и пытаюсь присвоить значения в этих ячейках массиву, но это приводит к ошибке типа Mismatch. Соответствующие биты моего кода ниже:Назначение значения диапазона для массива результатов при несоответствии типов

Dim queryaddress As Range 
Dim notoffsetnum As Integer 
Dim anotherarrayofnumbers() As Integer 
Dim c As Range 
For Each queryaddress In worksheetname.Range("B2:B21") 
Set queryrow = queryaddress.EntireRow 
notoffsetnum = 0 
For Each c In queryrow 
If c.Interior.Color <> 192 And Not IsEmpty(c.Value) Then 
notoffsetnum = notoffsetnum + 1 
ReDim Preserve anotherarrayofnumbers(notoffsetnum) 
anotherarrayofnumbers(notoffsetnum) = c.Value 
'The above line errors 
End If 




Next c 
Next queryaddress 
+2

Выполняют ли все непустые ячейки, которые вы зацикливаете, целые значения? Используйте окно Immediate для проверки значения notoffsetnum при возникновении ошибки, а затем посмотрите на значение в соответствующей ячейке – barrowc

+0

@barrowc. Это была проблема, у меня не было целочисленных значений для одного из 'c.Value'. Фильтрация этого одного значения закончила ошибку. –

ответ

2

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 
+0

Это приводит к той же ошибке. –

0

Проблематика бит моего кода был такой:

Dim anotherarrayofnumbers() As Integer

Это привело к ошибке на:

anotherarrayofnumbers(notoffsetnum) = c.Value

Это потому, что некоторые из моих c.Value ценностей были а не целые.

Одним из способов решения этой проблемы является изменение массив типа Variant:

Dim anotherarrayofnumbers() As Variant

Но это не работает для меня, как я потом должен был выполнять целочисленные операции (например, WorksheetFunction.Quartile) на массиве , Вместо этого я просто применил форматирование к значениям c.Value, которые не были целыми значениями, чтобы отфильтровать их из моего массива. Это решило мои проблемы.

Так что мой обусловливающие If блок теперь выглядит следующим образом:

If c.Interior.Color <> 192 And c.Interior.Color <> 177 And Not IsEmpty(c.Value) Then

Если дополнительный цвет салона является то, что я отформатировал нецелые значения, как.

Смежные вопросы