2016-08-01 27 views
1

我有兩個表,我加入名字字段有時有一箇中間的名字後面的名字,中間有一個空格。所以對同一個人來說,價值可能是Jane MJane Moriarty我該如何處理#func!函數不適用的單元格中的錯誤?

(我也加入了關於姓氏和出生日期,但那些都不是這個問題的一部分)

兩個表之間,一個通常整個中間名,而其他通常有中間初始。由於這種不匹配,我需要在加入之前修剪空間和字符。

搶我想要的文字,我使用

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

到目前爲止,一切都很好。但是,對於既沒有初始名也沒有中間名的單元,例如Jane,訪問返回#func!。推測是因爲Instr找不到空間。所以當我嘗試加入修剪的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!的單元的代碼。

回答

2

首先,您需要一個微小的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太)

+0

完美。我驚訝地發現模塊名稱似乎並不重要。我可以將一堆函數放在一個模塊中,還是每個模塊只有一個?我懷疑這是一個好主意,但我很好奇。 – Rominus

+0

您可以將任意數量的功能放入一個模塊中(並且通常將多個功能合併到一個模塊中)。模塊名稱不能與子/函數相同,否則確實無關緊要。 @ReidMcCamish – Andre

+0

是的,發現了困難的方式! – Rominus