Question

This works Lastrow = 8, but not 9 (Type mismatch)

If i remove If Not (myarray = Empty) Then it does not work for 8

What is the easiest way to solve this?

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
Was it helpful?

Solution

MyArray is taking 2 different types, depending on the range given.
If you are looking at 1 cell, then it is a single variant (which can be tested if it is Empty)
If you are looking at 2 or more cells, then it becomes an array of variant, so you would have to test each cell.

myarray = Sheets(SheetName).Range("d8:d8").Value - myarray gets the value in d8
myarray = Sheets(SheetName).Range("d8:d9").Value - myarray(1,1) gets the value in d8, and myarray(2,1) gets the value in d9

to test, use:

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

OTHER TIPS

I feel like your code should look more like this

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

BUT I also think there is another way to do what you want. A little simpler and used built in functions. I think I captured your intention here:

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

(without value)... And you can use: if ubound(myArray) > 1 then ;..

I think it could be as easy as this, no...?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top