首页 > 解决方案 > VBA函数分配空字符串而不是范围值

问题描述

我正在使用以下函数查看表的第 1 列 ( rngSearch) 并在第 2 列中返回相应的值,基本上反映了VLOOKUP. 它通常按预期工作,除非它没有。它有时会返回 avbNullString而不是所需的字符串值。

Function get_short_string(rngSearch As Range, strSearch As String) As String

    get_short_string = vbNullString

    For i = 1 To rngSearch.Rows.Count
        If LCase(rngSearch(1)(i)) = LCase(strSearch) Then
            get_short_string = rngSearch(2)(i)
            Exit Function
        End If
    Next i

End Function

我已经逐步完成了该功能并将其缩小到这一行:

get_short_string = rngSearch(2)(i)

当我? rngSearch(2)(i)此时进入即时窗口时,我得到了所需的输出字符串。然后当我执行时,该行get_short_string被分配了一个vbNullString. 至少我是这么认为的,当我get_short_string在执行工具提示显示的行后将鼠标悬停在get_short_string =没有空字符串的情况下""。我也尝试过rngSearch(2)(i).ValuerngSearch(2)(i).Value2结果相同。

编辑:谢谢你的回答。问题似乎不在代码中,而在于正在处理的字符串。我将用 VlookUp 替换这个自定义函数并进一步调查。

EDIT2:按照这里的要求,是原始德语形式的表格样本:

+----------------------------------------------------------+------------------+
|                Internes Projekt nach CRM                 |     Kurzname     |
+----------------------------------------------------------+------------------+
| Urlaub | geplante Abwesenheit 2020                       | URLAUB           |
| Interne Projekte 2020                                    | INTERNE PROJEKTE |
| Akquise 2020                                             | AKQUISE          |
| Unterstützung (nicht fakturierbar) anderer Projekte 2020 | andere           |
| Verwaltung | Arbeitsorganisation 2020                    | VERWALTUNG       |
| Interne Projekte 2019                                    | INTERNE PROJEKTE |
| Unterstützung Team (intern)                              | andere           |
+----------------------------------------------------------+------------------+

在第 2 行中查找确切的字符串时Urlaub | geplante Abwesenheit 2020,代码正确识别第 2 行。当我使用? rngSearch(2)(i)它输出的即时窗口时URLAUB,该函数返回一个空变量。

标签: excelvba

解决方案


我无法确定您的代码到底在哪里出错,但下面的函数在语法上更清晰,在执行上也更健壮。我不认为它会给你同样的错误。

Function GetShortString(rngSearch As Range, _
                        strSearch As String) As String

    Dim R As Long

    With rngSearch
        For R = 1 To .Rows.Count
            If StrComp(.Cells(R, 1).Value, strSearch, vbTextCompare) = 0 Then
                GetShortString = .Cells(R, 2).Value
                Exit Function
            End If
        Next R
    End With
End Function

但是,循环遍历一个范围需要时间。如果您对速度感兴趣,请改用以下功能。

Function ShortString(rngSearch As Range, _
                     strSearch As String) As String
    ShortString = Application.VLookup(strSearch, rngSearch, 2, False)
End Function

推荐阅读