Excel 从VBA中的函数中选择单元格

Excel 从VBA中的函数中选择单元格,excel,vba,Excel,Vba,我想要一个宏,它首先激活一个特定的工作表,然后选择一个特定的单元格。但是,当我运行下面的代码时,我得到以下消息: 运行时错误:“1004”:选择范围类的方法失败 我做错了什么 Function selectingCells(myWs As String, myCell As Range) Sheets(myWs).Activate myCell.Select End Function Sub callingFunction() Call selectingCell

我想要一个宏,它首先激活一个特定的工作表,然后选择一个特定的单元格。但是,当我运行下面的代码时,我得到以下消息:

运行时错误:“1004”:选择范围类的方法失败

我做错了什么

Function selectingCells(myWs As String, myCell As Range)

    Sheets(myWs).Activate
    myCell.Select

End Function

Sub callingFunction()

    Call selectingCells("Data", Range("A1"))
    Call selectingCells("Picklist", Range("A1"))

End Sub
范围(“A1”)
适用于当前活动工作表上的特定单元格。您的错误是因为当您在不同的工作表上定义范围(即进行函数调用)时,您试图在任何激活的工作表上选择一个单元格

这将对您有用:

Function selectingCells(myWs As String, myCell As String)
    Sheets(myWs).Activate
    Range(myCell).Select
End Function

Sub callingFunction()
    Call selectingCells("Data", "A1")
    Call selectingCells("Picklist", "A1")
End Sub
几点注意:

  • 除非这是一个最小的可复制代码位,
    selectingCells
    不需要成为
    函数,因为它不返回任何内容。如果将其设置为
    Sub
  • 调用函数
    中不需要
    调用
    <代码>调用
    已弃用,仅为向后兼容而维护
同样,除非您的代码比此示例更多,
callingFunction
可以重写为:

sub callingFunction()
  Sheets("Data").Range("A1").select
  Sheets("Picklist").Range("A1").select
end sub

而且效率更高

myCell参数是存在于其他工作表上的范围引用。尝试输入要选择的单元格地址的字符串值,如下所示:

Function selectingCells(myWs As String, myCell As String)

Sheets(myWs).Activate
Sheets(myWs).Range(myCell).Select

End Function

Sub callingFunction()

Call selectingCells("Data", "A1")
Call selectingCells("Picklist", "A1")

End Sub
Call selectingCells("Data", Activesheet.Range("A1"))
Call selectingCells("Picklist", Activesheet.Range("A1"))
Function selectingCells(myCell As Range)

    myCell.parent.Activate
    myCell.Select

End Function

Sub callingFunction()

    Call selectingCells(sheets("Data").Range("A1"))
    Call selectingCells(sheets("Picklist").Range("A1"))

End Sub

selectingCells
被定义为函数有什么原因吗?它会向调用代码返回一些值吗?如果没有,您可以将其定义为一个过程。

在子部分中,您正在定义活动表的范围。因此,如果您选择其他工作表并尝试选择范围,则该工作表不起作用。
要更正此问题,请正确定义范围:

Sub callingFunction()

    Call selectingCells("Data", ThisWorkbook.Sheets("Data").Range("A1"))
    Call selectingCells("Picklist", ThisWorkbook.Sheets("Picklist").Range("A1"))

End Sub

因为没有限定范围对象,所以函数的行为如下:

Function selectingCells(myWs As String, myCell As String)

Sheets(myWs).Activate
Sheets(myWs).Range(myCell).Select

End Function

Sub callingFunction()

Call selectingCells("Data", "A1")
Call selectingCells("Picklist", "A1")

End Sub
Call selectingCells("Data", Activesheet.Range("A1"))
Call selectingCells("Picklist", Activesheet.Range("A1"))
Function selectingCells(myCell As Range)

    myCell.parent.Activate
    myCell.Select

End Function

Sub callingFunction()

    Call selectingCells(sheets("Data").Range("A1"))
    Call selectingCells(sheets("Picklist").Range("A1"))

End Sub
如果您不在与您尝试选择的范围相同的工作表上,则会出现错误。如果愿意,可以将函数更改为一个参数,因为工作表信息包含在其中。大概是这样的:

Function selectingCells(myWs As String, myCell As String)

Sheets(myWs).Activate
Sheets(myWs).Range(myCell).Select

End Function

Sub callingFunction()

Call selectingCells("Data", "A1")
Call selectingCells("Picklist", "A1")

End Sub
Call selectingCells("Data", Activesheet.Range("A1"))
Call selectingCells("Picklist", Activesheet.Range("A1"))
Function selectingCells(myCell As Range)

    myCell.parent.Activate
    myCell.Select

End Function

Sub callingFunction()

    Call selectingCells(sheets("Data").Range("A1"))
    Call selectingCells(sheets("Picklist").Range("A1"))

End Sub
尝试:


为什么要将函数用于如此简单的任务

使用这种方法

Sub test()
    Sheets("Data").[A1].Select
    Sheets("Picklist").[A1].Select
End sub

厄运!看起来真的很熟悉…:谢谢你的帮助!谢谢你的帮助!谢谢你的帮助!谢谢你的帮助!不客气。还有,@Victor,请看一下推荐的。使用
的情况很少。选择
是必要的,该链接将向您展示如何避免使用它以及刚才遇到的困惑。您应该尽量避免使用选择。看看这个:为什么要选择单元格?