Несоответствие типов VBA

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

Если я удалю 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

4 ответа

Решение

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

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

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
myarray = Sheets(SheetName).Range("d8:d" & LastRow)

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

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

Другие вопросы по тегам