0

これは 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

4 に答える 4

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
于 2012-06-28T15:02:06.763 に答える
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
于 2012-06-28T17:31:53.083 に答える
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
于 2012-06-28T17:54:46.707 に答える
0
myarray = Sheets(SheetName).Range("d8:d" & LastRow)

(値なし)...そして、次を使用できます:if ubound(myArray) > 1 then ;..

私はそれがこれと同じくらい簡単かもしれないと思う.いいえ...?

于 2012-06-28T15:17:52.993 に答える