Vba EXCEL传递给函数的范围始终为空

Vba EXCEL传递给函数的范围始终为空,vba,excel,Vba,Excel,我正在尝试在Excel2007中创建一个用户定义的函数。该函数位于VBA模块内,接受单个参数,即范围对象。问题是接收时参数总是空的。我错过了什么 Function ConcatenateCells(p_objConcatArea As Range) As String '****************************************** ' Initialize Variables '***********************************

我正在尝试在Excel2007中创建一个用户定义的函数。该函数位于VBA模块内,接受单个参数,即范围对象。问题是接收时参数总是空的。我错过了什么

Function ConcatenateCells(p_objConcatArea As Range) As String
    '******************************************
    ' Initialize Variables
    '******************************************
    Dim strReturnString As String

    '******************************************
    ' Process Each Cell In Range
    '******************************************
    strReturnString = ""
    For Each objCellValue In p_objConcateArea
        If (objCellValue <> "") Then
            If (strReturnString <> "") Then strReturnString = strReturnString & ", "
            strReturnString = strReturnString & objCellValue
        End If
    Next

    '******************************************
    ' Return Final Value
    '******************************************
    ConcatenateCells = strReturnString
End Function
我得到了#价值作为我的结果。我仔细检查了代码,发现参数(p_objcatearea)总是空的。为什么我不能将范围传递给我的UDF

救命啊

-Ben

对于不使用Option Explicit时出现的问题,这是一个“经典”案例。我纠正了你的打字错误

Option Explicit

Function ConcatenateCells(p_objConcatArea As Range) As String
    '******************************************
    ' Initialize Variables
    '******************************************
    Dim strReturnString As String
    Dim objCellValue
    'Dim p_objConcateArea

    '******************************************
    ' Process Each Cell In Range
    '******************************************
    strReturnString = ""
    For Each objCellValue In p_objConcatArea
        If (objCellValue <> "") Then
            If (strReturnString <> "") Then strReturnString = strReturnString & ", "
            strReturnString = strReturnString & objCellValue
        End If
    Next

    '******************************************
    ' Return Final Value
    '******************************************
    ConcatenateCells = strReturnString
End Function
选项显式
函数将单元格(p_objConcatArea作为范围)连接为字符串
'******************************************
'初始化变量
'******************************************
Dim streturnstring作为字符串
模糊目标值
“暗p_对象关联区域”
'******************************************
'处理范围内的每个单元格
'******************************************
strReturnString=“”
对于p_objconcatara中的每个objcell值
如果为(objCellValue“”),则
如果为(strReturnString“”),则strReturnString=strReturnString&“
strerturnstring=strerturnstring&objCellValue
如果结束
下一个
'******************************************
'返回最终值
'******************************************
ConcatenateCells=strReturnString
端函数

您应该使用选项显式“`^^^^
p_objconcatea
p_objconcateaOMG、类型和缺少的系统标志。我已经很久没有使用VBA了,我忘了没有intellisense是多么烦人。非常感谢。Tools~Options~Editor Tab~需要变量声明才能将
Option Explicit
放在所有新模块上。还必须始终指定按值传递参数
串联单元格(ByVal p_objConcatArea As Range)
。如果不使用
ByVal
,默认情况下,VBA通过引用传递参数。这会给你带来一些讨厌的、难以找到的bug。这是。
Option Explicit

Function ConcatenateCells(p_objConcatArea As Range) As String
    '******************************************
    ' Initialize Variables
    '******************************************
    Dim strReturnString As String
    Dim objCellValue
    'Dim p_objConcateArea

    '******************************************
    ' Process Each Cell In Range
    '******************************************
    strReturnString = ""
    For Each objCellValue In p_objConcatArea
        If (objCellValue <> "") Then
            If (strReturnString <> "") Then strReturnString = strReturnString & ", "
            strReturnString = strReturnString & objCellValue
        End If
    Next

    '******************************************
    ' Return Final Value
    '******************************************
    ConcatenateCells = strReturnString
End Function