2012-06-28 5 views
0

Это работает Lastrow = 8, но не 9 (тип рассогласование)Несоответствие типа VBA

Если я удалить If Not (myarray = Empty) Then он не работает в течение 8

Что это самый простой способ решить эту проблему?

Public Function GetRowToWriteOn(ByVal SheetName As String, ByVal idnr As Integer) As Integer 
    LastRow = (Sheets(SheetName).UsedRange.Rows.Count) + 1 
    MsgBox (LastRow) 
    myarray = Sheets(SheetName).Range("d8:d" & LastRow).Value 
    If Not (myarray = Empty) Then 
     For row = 1 To UBound(myarray, 1) 
      If (myarray(row, 1) = idnr) Then 
       GetRowToWriteOn = row 
       Exit Function 
      End If 
     Next 
    End If 
    GetRowToWriteOn = LastRow 
    Exit Function 
End Function 
+0

Какие значения '' LastRow' и row'? Удивление, если вы превышаете пределы целого числа. – markblandford

+0

О, извините, это на самом деле Lastrow, который составляет 8 и 9 –

+0

Вы используете опцию явным? – Trace

ответ

3

MyArray принимает 2 разных типа, в зависимости от заданного диапазона.
Если вы ищете 1 ячейку, то это единственный вариант (который может быть протестирован, если он пуст)
Если вы ищете 2 или более ячеек, то это будет массив вариантов, поэтому у вас будет для проверки каждой ячейки.

myarray = Sheets(SheetName).Range("d8:d8").Value - MyArray получает значение в d8
myarray = Sheets(SheetName).Range("d8:d9").Value - MyArray (1,1) получает значение в d8 и MyArray (2,1) получает значение в d9

для тестирования, использование:

if vartype(myarray)=vbArray then 
    ' run through the array 
else 
    ' do single value stuff 
endif 
+0

Похоже, что я хочу, я проверил его позже сегодня. Спасибо! –

+0

Кажется, что myarray не является vbarray, он дает type = 8204. Я буду исследовать дальше –

+0

Я сделал это легко, сравнивая его с 8204 напрямую :) Вы так или иначе привели меня вправо :) Спасибо большое! –

0
myarray = Sheets(SheetName).Range("d8:d" & LastRow) 

(без значения) ... И вы можете использовать: if ubound(myArray) > 1 then ;..

Я думаю, что это может быть так просто, как это, нет ...?

+0

Я уверен, что вы можете загрузить диапазон непосредственно в массив и наоборот, если они оба одинакового размера. – Trace

+1

ubound (myarray) генерирует ошибку, если используется на одном значении – SeanC

+0

Возможно, что нужно установить myArray многомерным с помощью оператора redim first => myArray (1 на что-то, от 1 до 1). Вам нужно будет проверить. – Trace

1

Я чувствую, что ваш код должен выглядеть как этот

Option Explicit 

Public Function GetRowToWriteOn(ByVal SheetName As String, ByVal idnr As Integer) As Integer 
Dim lastrow As Long, row As Long 
    lastrow = (Sheets(SheetName).UsedRange.Rows.Count) + 1 
    MsgBox (lastrow) 
    Dim myarray() As Variant 
    myarray = Sheets(SheetName).Range("d8:d" & lastrow).Value 
    If Not (IsEmpty(myarray)) Then 
     For row = 1 To UBound(myarray, 1) 
      If (myarray(row, 1) = idnr) Then 
       GetRowToWriteOn = row 
       Exit Function 
      End If 
     Next 
    End If 
    GetRowToWriteOn = lastrow 
    Exit Function 
End Function 

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

Dim RowToWriteOn As Long, SheetName As String, lastRow As Long 

Dim rng As Range 

SheetName = "Sheet1" 
lastRow = (Sheets(SheetName).UsedRange.Rows.Count) + 1 
Set rng = Sheets(SheetName).Range("d" & lastRow) 
RowToWriteOn = rng.End(xlUp).row 
+0

Ну, вы пропустили идентификатор в своем примере, поэтому он не будет писать в уже существующей строке –

1
Public Function GetRowToWriteOn(ByVal SheetName As String, _ 
           ByVal idnr As Integer) As Long  
    Dim lastRow As Long, f As Range 
    lastRow = Sheets(SheetName).Cells(Rows.Count, 4).End(xlUp).Row 

    Set f = Sheets(SheetName).Range("D8:D" & lastRow).Find(what:=idnr, _ 
                 lookat:=xlWhole) 
    If Not f Is Nothing Then 
     GetRowToWriteOn = f.Row 
    Else 
     GetRowToWriteOn = lastRow + 1 
    End If 

End Function 
+0

Спасибо, мне удалось с другим (не так красивым, как этот) способом, поэтому я не тестировал это, но похоже, что он может работать. –

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