我该如何处理#func!该功能不适用的单元格中的错误?

How do I deal with #func! errors in cells where the function doesn't apply?

我有两个表,我在名字字段上加入,有时名字后面有一个中间名或中间名,中间有一个 space。因此对于同一个人,该值可能是 Jane MJane Moriarty

(我也加入了姓氏和出生日期,但这些不是这个问题的一部分)

在这两个列表之间,一个通常是完整的中间名,而另一个通常是中间名的首字母。由于这种不匹配,在加入之前我需要 trim space 和后面的字符。

为了获取我想要的文本,我正在使用

LEFT(Patients.FIRST_NAME, Instr(Patients.FIRST_NAME, ' ',) -1) as FIRST_NAME_TRIM

到目前为止,还不错。但是,对于既没有初始名称也没有中间名称的单元格,例如Jane,访问 returns #func!。大概是因为 Instr 找不到 space。因此,当我尝试加入 trimmed var 时,Access 会引发错误。如果我这样尝试

SELECT var1, var2, var3,
    LEFT(Patients.FIRST_NAME, Instr(Patients.FIRST_NAME, ' ') -1) as FIRST_NAME_TRIM, 
    LEFT(Roster.FST_NM, Instr(Roster.FST_NM, ' ') -1) as FST_NM_TRIM
FROM Patients
INNER JOIN Roster 
    ON FIRST_NAME_TRIM = FST_NM_TRIM;

我得到JOIN expression not supported

如果我这样尝试

SELECT var1, var2, var3, 
Patients_mod.FIRST_NAME_TRIM,
Roster_mod.FST_NM_TRIM
FROM 
    (
    SELECT var1, var2, var3, 
    LEFT(Patients.FIRST_NAME, Instr(Patients.FIRST_NAME, ' ') -1) as FIRST_NAME_TRIM 
    FROM Patients
    ) as Patients_mod
LEFT JOIN
    (
    SELECT var1, var2, var3,
    LEFT(Roster.FST_NM, Instr(Roster.FST_NM, ' ',) -1) as FST_NM_TRIM
    FROM Roster
    ) as Roster_mod
ON Roster_mod.FST_NM_TRIM = Patients_mod.FIRST_NAME_TRIM;

我得到 Syntax error in FROM clause,但我没有看到语法错误。

所以我要么需要首先防止 #func! 问题,要么找到忽略具有 #func!.

的单元格的代码

首先,您需要一个很小的 ​​VBA 函数来获取修剪后的名字。 Split() 是最好的选择,它适用于带有 " " 和不带

的名称。

此函数进入标准模块。

Public Function GetFirstName(vName As Variant) As Variant

    If Len(vName) > 0 Then
        GetFirstName = Split(vName, " ")(0)
    Else
        GetFirstName = Null
    End If

End Function

然后你可以加入计算字段:

SELECT Patients.First_Name, Roster.FST_NM
FROM Patients INNER JOIN Roster 
ON GetFirstName(Patients.First_Name) = GetFirstName(Roster.FST_NM);

(它也适用于 LEFT JOIN