我当前在工作簿的工作表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函数的错误。
答案 0 :(得分:0)
所有这些可能与您的情况无关,但在某些类似情况下可能很有用。它只是一直在我的头上响起,你知道当你不能闭上嘴时的感觉。
我会这样写函数:
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
'块。