gpt4 book ai didi

vba - 为什么我的电子表格函数的行为与从代码调用时的行为不同?

转载 作者:行者123 更新时间:2023-12-04 19:10:09 26 4
gpt4 key购买 nike

当我从 Excel 调用函数时(在单元格中):

=allVlookup(O24,A:D,3,"")

与通过 vba
MsgBox allVlookup(Range("O24"), Range("A:D"), 3, "")

我得到不同的结果。当从 Excel 调用时,我只得到第一个匹配,但是当从具有相同参数的 vba 测试子调用时(除了将 Range 添加到参数以允许子运行),我得到完整的结果(超过一)。

我正在使用的功能是:
Public Function allVlookup(lookupRange As Range, tableRange As Range, colIndex As Integer, Optional delimiter As String = "") As String

Dim c As Range
Dim firstAddress As String
'MsgBox tableRange.Address ' this is correct
'With Sheets(4).Range("A1:C12").Columns(1)
'With Range("A1:C12").Columns(1)

'this doesn't allow things to work right either (???)
'Set tableRange = Range("A:D")
'Set lookupRange = Range("O24")

'search only the first column for matches
With tableRange.Columns(1)
Set c = .Find(what:=lookupRange.Value, LookIn:=xlValues)

If Not c Is Nothing Then

firstAddress = c.Address

Do
'add the delimiter
If (allVlookup <> "") Then
allVlookup = allVlookup + delimiter
End If

'append value to previous value
allVlookup = allVlookup + c.Offset(0, colIndex).Value


Set c = .FindNext(c)
'exit conditions
'no match found
If (c Is Nothing) Then
Exit Do
'we're back to start
ElseIf (c.Address = firstAddress) Then
Exit Do
End If

Loop
End If
End With

End Function

我无法解释为什么会发生这种情况。

我该怎么做才能使输出相同?

最佳答案

更改 .Find线入:

Set c = .Find(what:=lookupRange.Value2, after:=.Cells(1), LookIn:=xlValues, LookAt:=xlWhole)

并另外更改 .FindNext进入:
Set c = .Find(what:=lookupRange.Value2, after:=c, LookIn:=xlValues, LookAt:=xlWhole)

请记住, tableRange范围应该有列标题。否则,结果顺序将不会像预期的那样。

最后一句的附加(已编辑)解释。如果你有那种类型的表:
    |  A  |  B  |  C  |  D  |
--+-----+-----+-----+-----+
1 | ABC 1 2 A
2 | ABC 3 4 B
3 | ABC 5 6 C

range("A1:D3") 中搜索 ABC 时要从 D 列获取数据,您将得到以下结果: BCD .获取 ABC第一行应该有列标题。

关于vba - 为什么我的电子表格函数的行为与从代码调用时的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15688360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com