Несоответствие типов 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 получает значение в d8myarray = 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 ;..
Я думаю, что это может быть так просто, нет...?