2012-06-28 122 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

对不起,它实际上是拉斯特罗,它是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(2,1)的值,并获取myarray中在D9的值

测试,使用:

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

看起来像我想要的,今天晚些时候我会检查出来。 谢谢! –

+0

看起来像myarray不是vbarray,它给出了类型= 8204.我将进一步调查 –

+0

我做到了这一点,直接与8204比较:)你带我正确的方式:)谢谢! –

0
​​

(无值)... 你也可以使用:if ubound(myArray) > 1 then ;..

我认为它可以像这样简单,不... ...?

+0

我相当肯定你可以将一个范围直接加载到一个数组中,反之亦然,如果它们的大小相同。 – Trace

+1

如果在单个值上使用ubound(myarray)将会产生一个错误 – SeanC

+0

可能需要通过redim语句first => myArray(1 to something,1 to 1)来设置myArray多维度您需要检查。 – 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

那么你错过了你的例子中的id,所以它不会写在已经存在的行上 –

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

谢谢,我用另一个(不如这样漂亮的方式)管理,所以我没有测试过,但它似乎可以工作。 –