我该如何处理#func!该功能不适用的单元格中的错误?
How do I deal with #func! errors in cells where the function doesn't apply?
我有两个表,我在名字字段上加入,有时名字后面有一个中间名或中间名,中间有一个 space。因此对于同一个人,该值可能是 Jane M
或 Jane 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
)
我有两个表,我在名字字段上加入,有时名字后面有一个中间名或中间名,中间有一个 space。因此对于同一个人,该值可能是 Jane M
或 Jane 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
)