将单元格地址的位置存储到VBA中的变量

时间:2014-07-14 11:44:04

标签: excel vba excel-vba runtime-error

我在Excel中使用VBA并且我正在使用一个函数来查找第一个空行然后添加一些值,之后我需要将单元格的地址传递给另一个函数但是使用下面的代码我得到了一个运行时错误。 firstEmptyRow是一个返回范围的函数,例如。 $A$280

Dim addCell as Range

'Find first empty row in the table
With firstEmptyRow

'Enter Values
.Value = taskID
.Offset(0, 1).Value = jobID
.Offset(0, 2).Value = jobName
.Offset(0, 6).Value = taskTypeID
.Offset(0, 8).Value = taskName
.Offset(0, 9).Value = desc
.Offset(0, 11).Value = estMins
.Offset(0, 13).Value = "No"

set addCell = .Address //Gives a runtime error

End With

保存单元格地址的正确方法是什么,以便将其传递给另一个函数?下面是firstEmptyRow的代码

Public Function firstEmptyRow() As Range 'Returns the first empty row in the Schedule sheet

    Dim i, time As Long
    Dim r As Range
    Dim coltoSearch, lastRow As String
    Dim sheet As Worksheet

    Set sheet = Worksheets("Schedule")
    time = GetTickCount
    coltoSearch = "A"

    For i = 3 To sheet.Range(coltoSearch & Rows.Count).End(xlUp).Row
        Set r = sheet.Range(coltoSearch & i)
        If Len(r.Value) = 0 Then
            Set firstEmptyRow = sheet.Range(r.Address)
            'r.Select
            Exit For 'End the loop once the first empty row is found
        End If
    Next i

'Debug.Print "firstEmptyRow time: " & GetTickCount - time, , "ms"

End Function

3 个答案:

答案 0 :(得分:8)

.Address属性返回一个字符串,因此您需要像这样设置addCell变量:

Set addCell = Worksheets("Schedule").Range(.Address)

答案 1 :(得分:0)

您不需要使用类似Set addCell = Worksheets("Schedule").Range(.Address)的代码来使代码过于复杂,因为它确实使可读性变得有些困难。通常,尝试以下简单的操作:Set FirstEmptyRow = myCell。然后可以将整个代码重写为:

Public Function FirstEmptyRow() As Range

    Dim myCell As Range
    Dim coltoSearch As String, lastRow As String
    Dim wks As Worksheet

    Set wks = Worksheets(1)
    coltoSearch = "A"

    Dim i As Long
    For i = 3 To wks.Range(coltoSearch & Rows.Count).End(xlUp).Row
        Set myCell = sheet.Range(coltoSearch & i)
        If IsEmpty(myCell) Then
            Set FirstEmptyRow = myCell
            Exit For
        End If
    Next i

    If i = 2 ^ 20 Then
        MsgBox "No empty rows at all!"
    Else
        Set FirstEmptyRow = sheet.Range(coltoSearch & i + 1)
    End If

End Function

代码的最后一部分确保,如果最后一行和第3行之前没有空单元格,则将给出下一个单元格作为答案。此外,它检查下一行是否不是Excel中的最后一行,如果是,则为MsgBox()提供一些信息。

答案 2 :(得分:0)

我对vba完全是“菜鸟”,通过尝试对我来说似乎可以解决我遇到的问题的代码段和例程来学习。当我尝试由Vityata发布的代码时,遇到“ 运行时错误'424':必需对象 在以下位置:

    Set myCell = Sheet.Range(coltoSearch & i)
    Set FirstEmptyRow = Sheet.Range(coltoSearch & i + 1)

按如下所示更改stmts为我解决了错误:

    Set myCell = wks.Range(coltoSearch & i)
    Set FirstEmptyRow = wks.Range(coltoSearch & i + 1)

我还在最后一个End If和End Function语句之间添加了一个Debug.Print语句,以便在进行如下测试时可以快速看到结果:

        End If
        Debug.Print "The 1st empty cell address is "; coltoSearch & i
    End Function

如果我违反了某些发布规则,请接受我的道歉。希望分享这些内容可以避免以后使用类似学习过程的其他人感到困惑。