功能与数组功能

时间:2013-11-20 10:49:07

标签: arrays excel function vba excel-vba

我的代码中没有错误。我整个上午都在搜索错误!所以我希望你能帮助我。

首先,这是问题代码(变量的名称不是它们的真实姓名):

Sheets(sheet).Range(nameOfTheRange).FormulaR1C1 = _
    functionReturningString(functionReturningStrArr( _
      Range(nameOfAnotherRange).Value, AnInputWorkSheet, "colNameInInputSheet"))

所以我对此的描述:

所有功能都可以单独使用,但是总是会出现这种错误(语言:德语):

  

Fehler beim Kompilieren:

     

Unverträglicher类型:Datenfeld oder benutzerdefinierter Typ erwartet

functionReturningString是具有以下参数的函数(strArr()作为Variant) - >它返回一个像子弹列表一样的字符串。

functionReturningStrArr(nameWhichISearchInSheet as String, dataSheet as Worksheet, dataColumn, as String) - >它返回bulletListing的Variant()

我不确定第二种方法是否真的有效,所以这里是它的代码。

Function functionReturningStrArr(ByVal nameWhichISearchInSheet As String, ByVal datasheet As Worksheet, ByVal datacolumn As String) As String()
Dim returnArray() As String
Dim rowindex As Integer
Dim ID As String


Sheets(rawdataOverall).Cells(1, getColNumFromColName("Project")).EntireColumn.Select

'search correct dataset
For Each cell In Selection
    If cell.Value = nameWhichISearchInSheet Then
        rowindex = cell.row
        Exit For
    End If
Next cell

'get ID
ID = Sheets(rawdataOverall).Cells(rowindex, getColNumFromColName("ID")).Value


'search data from file with this ID
datasheet.Cells(1, getColNumFromColName(datacolumn)).EntireColumn.Select
Selection.UsedRange.Select

For Each cell In Selection
    rowindex = cell.row
    'check if row contains to this project
    If Cells(rowindex, getColNumFromColName("ID")) = ID Then
        ReDim Preserve returnArray(UBound(returnArray) + 1)
        returnArray(UBound(returnArray)) = cell.Value
    End If
Next cell

functionReturningStrArr = returnArray()

如果你问自己什么是getColNumFromColName,这是一种非常好的方法,我也在其他项目中使用它。

2 个答案:

答案 0 :(得分:3)

您必须开始使用Dim明确声明所有内容 - 并强制自己通过在模块顶部编写Option Explicit来执行此操作。这样您就可以更快地识别错误。

下面

'get ID
ID = Sheets(rawdataOverall).Cells(rowindex, getcolnumformcolname("ID")).Value

你调用一个名为getcolnumformcolname的函数;大概form是一个拼写错误,你的意思是FromgetColNumFromColName一样。如果您有Option Explicit,您会立即检测到该错误。

未声明以下三个变量/数组:rawdataOverallcellgetDataFromThisProject。您应该声明它们并明确地为它们分配类型。

尝试修理这些东西,看看它带给你的地方。

答案 1 :(得分:0)

似乎功能代码片段的一小部分是错误的。在最后一行,你应该将returnArray()的值赋值给你的函数名,如下所示:

functionReturningStrArr = returnArray()

否则,您需要从名为“getDataFromActualProject”的变量中提取数组,如示例所示。

编辑:

更改函数“functionReturningStrArr As Variant”以返回“As String()”而不是Variant。看起来你不能像你期望的那样将Variant转换为字符串数组。

编辑:

我创建了一个测试它的函数。当您尝试将Variant强制转换为字符串数组时,将显示此编译错误。这还包括一个修复,你的函数返回Variant MUST返回字符串数组。

Sub RunTest()

    Debug.Print getStringFromArray(getArray())
    Debug.Print getStringFromArray(getVariant()) ' compile error! you cannot cast variant to array of string

End Sub

Function getArray() As String()

    Dim returnArray(2) As String

    returnArray(0) = "A"
    returnArray(1) = "B"
    returnArray(2) = "C"

    getArray = returnArray()

End Function

Function getVariant() As Variant()

    Dim returnArray(2) As String

    returnArray(0) = "A"
    returnArray(1) = "B"
    returnArray(2) = "C"

    getArray = returnArray() ' Not a compile error, you can cast string array to variant

End Function

Function getStringFromArray(inputArray() As String) As String

    Dim returnString As String
    For i = LBound(inputArray()) To UBound(inputArray())
        If returnString = "" Then
            returnString = inputArray(i)
        Else
            returnString = returnString & "," & inputArray(i)
        End If
    Next i
    getStringFromArray = returnString

End Function