2009-08-17 54 views
2

我想查找表中的空值和空值。我使用Asc將表格的值分配給一個變量,然後根據它們的ASCII值區分空和空白。但是當代碼試圖讀取空字段的ASCII值時,我得到了"runtime error 94: Invalid use of null"訪問Vba - 查找空值和空值

+0

請問您使用此功能的是什麼?如果你確實試圖在表中找到它們,爲什麼不在查詢的where條件中放置null或「」而不是調用函數呢? – JohnFx 2009-08-19 02:34:47

回答

1

你可以試試下面的用戶定義函數測試表值:

Public Function text_test(str_in as Variant) As Long 
' given input str_in, return -2 if input is Null, 
'  -1 if input is zero-length string; otherwise return 0 
' use function Nz to test if input is Null and return -2, 
' otherwise check non-null value with Len 
' and return -1 if it is a 0-length string, 
' otherwise return 0 for anything else 
    text_test = IIf(Nz([str_in], "null") = "null", -2, _ 
     IIf(Len(str_in) = 0, -1, 0)) 
End Function 

在即時窗口中運行有不同的輸入測試: text_test(「弗雷德」) ; text_test( 「」); text_test(NULL); text_test(9); text_test(假)

應返回: 0 -1 -2 0 0

請注意,您不能在函數聲明中使用str_in作爲字符串,因爲這會導致您在問題中引用的同一錯誤。

3

當我必須處理的返回值可以爲null或零長度字符串,我使用轉換ZLS功能爲Null:

Public Function varZLStoNull(varInput As Variant) As Variant 
    If Len(varInput) = 0 Then 
     varZLStoNull = Null 
    Else 
     varZLStoNull = varInput 
    End If 
    End Function 

這需要的事實,即在VBA萊恩()函數將Null和ZLS完全相同,以便您不必分別處理每個個案。

但是,請記住,如果您在WHERE子句中使用它,則會失去性能,因爲它無法使用索引。因此,在WHERE子句中,您將測試IS NULL或=「」

SELECT MyField 
    FROM MyTable 
    WHERE MyField Is Null Or MyField = "" 

這樣會更高效。 varZLSToNull函數在將已處理數據附加到ZLS Allowed設置爲NO(如其應該)的字段時非常有用。

你應該考慮的另一件事是改變你的領域,以便它不允許ZLS,然後運行一個查詢(使用上面的WHERE子句而沒有Is Null)來將所有的ZLS替換爲Null。當然,假定你的數據不區分Null和ZLS,表示兩個不同的事物(Null意思是「我們在這裏沒有記錄任何值」,而ZLS意思是「我們在這裏記錄了一個空值)」 。

0

封裝代碼中的if語句中,比較像這樣的字符串值vbNullString:

If (Not (<string> = vbNullString) Then 

如果字符串不爲空執行原來的代碼

如果空添加一個else塊執行你需要做的,如果值爲空

0

是的,這是一個古老的線程,大不了...

這是測試,我已經看到了NULL和零長度值的最簡潔的方式:

FinalValue = IIf(Not Len(Nz(Value, "")) = 0, Value, Null) 

怎麼可能比大衛·芬頓的上述優異功能的執行,我不知道。我知道,我在這裏介紹的單線和David的功能幾乎完全一樣。我懷疑單線程可能會比呼叫函數更好一些。另一方面,它使用包容性的If,所以它實際上可能會變慢。誰知道?

我主要在Class模塊中使用它。例如,使用DAO Recordset創建記錄時:

With rst 
    .AddNew 
    !JobCardID = IIf(Not m_JobCardID = 0, m_JobCardID, Null) 
    !ConstructionProjectID = IIf(Not m_ConstructionProjectID = 0, m_ConstructionProjectID, Null) 
    !MajorDisciplineID = IIf(Not m_MajorDisciplineID = 0, m_MajorDisciplineID, Null) 
    !ActivityDescriptorID = IIf(Not m_ActivityDescriptorID = 0, m_ActivityDescriptorID, Null) 
    !ActivityStatus = IIf(Not Len(Nz(m_ActivityStatus, "")) = 0, m_ActivityStatus, Null 
    'etc... 
End With 

在上面的代碼中,ActivityStatus是相關的String。 注意:我從來沒有設計一個數據庫,其中的字段允許使用零長度的字符串。重複:從不。