使用VBA

时间:2018-12-20 17:17:10

标签: vba match user-defined-functions

我当前在工作簿的工作表2的J列中使用一个公式,该公式将从工作表1的5列中查找值并返回相应的文本。例如,如果工作表2上的M列中的值与工作表1上的J列中的任何值相匹配,则它将返回“ N”,如果不匹配,它将在列K中查找,如果与那里的任何值匹配,则将返回D,依此类推。 。我在VBA中这样做,所以使用的公式是

ActiveSheet.Range("J2:J" & intLastRow).FormulaR1C1 = _
    "=IFERROR(IF(ISNUMBER(MATCH(RC[3],Sheet1!C10,0)),""N"", 
IF(ISNUMBER(MATCH(RC[3],Sheet1!C11,0)),""D"", 
IF(ISNUMBER(MATCH(RC[3],Sheet1!C12,0)),""R"", 
IF(ISNUMBER(MATCH(RC[3],Sheet1!C13,0)),""G"", 
IF(ISNUMBER(MATCH(RC[3],Sheet1!C14,0)),""F"",""""))))), """")"

此公式效果很好,并填写了相应的值。然后,我创建了一个用户定义的函数,该函数将查找J列中与C列中找到的ID号相关联的所有值,并用逗号分隔它们。当输入单元格时,此功能也很好用。

Function get_areas(ID As String) As String
Dim rng As Range, cel As Range

Set rng = Range("A2:A" & Cells(rows.count,1).End(xlUp).Row)

Dim areas As String
For Each cel In rng
If IsNumeric(Left(cel, 1)) And cel.Offset(0, 2) = ID Then
    If InStr(1, areas, cel.Offset(0, 9)) = 0 Then
        areas = cel.Offset(0, 9) & ", " & areas
    End If
End If
Next cel

areas = Trim(Left(areas, Len(areas) - 2))
get_areas = areas
End Function

理想情况下,我想做的是在J列中所有不以Master开头的单元格中运行原始公式,然后在所有以master开头的单元格中运行get_areas($ C2)函数如果不可行,那么我想在VBA中的所有空白单元格中运行get_areas函数(这意味着它们没有从原始公式返回任何内容,但仍包含该公式)。我尝试将原始公式修改为

ActiveSheet.Range("J2:J" & intLastRow).FormulaR1C1 = 
"=IFERROR(IF(LEFT(RC[-9],6)=""master"", get_areas(RC[-7]),             
IF(ISNUMBER(MATCH(RC[3],Sheet1!C10,0)),""N"", 
IF(ISNUMBER(MATCH(RC[3],Sheet1!C11,0)),""D"", 
IF(ISNUMBER(MATCH(RC[3],Sheet1!C12,0)),""R"", 
IF(ISNUMBER(MATCH(RC[3],Sheet1!C13,0)),""G"", 
IF(ISNUMBER(MATCH(RC[3],Sheet1!C14,0)),""F"","""")))))), """")"

,但是收到有关get_areas函数的错误。

1 个答案:

答案 0 :(得分:0)

WorksheetFunction.Trim

所有这些可能与您的情况无关,但在某些类似情况下可能很有用。它只是一直在我的头上响起,你​​知道当你不能闭上嘴时的感觉。

我会这样写函数:

Function get_areas(ID As String) As String

Dim rng As Range
Dim i As Long
Dim areas As String

Set rng = Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row)

With rng
    For i = 1 To .Cells.Count
        If IsNumeric(Left(.Cells(i, 1))) And .Cells(i, 1).Offset(0, 2) = ID Then
            If InStr(1, areas, .Cells(i, 1).Offset(0, 9)) = 0 Then
                If i > 1 Then
                    areas = areas & ", " & .Cells(i, 1).Offset(0, 9)
                  Else
                    areas = .Cells(i, 1).Offset(0, 9)
                End If
            End If
        End If
    Next
End With

get_areas = WorksheetFunction.Trim(areas)

End Function

总的来说,它不如“ WorksheetFunction ”部分那么重要。

WorksheetFunction.Trim 删除单词之间除单个空格外的所有空格,而VBA的Trim函数仅删除左右空格。

另一个最明显的区别是'If i > 1'块。