如何避免在VBA中将零视为空

时间:2018-06-05 08:57:54

标签: vba excel-vba excel

上下文

我有一些VBA代码允许我将整个Excel表插入到postgresql数据库中。

代码的想法如下(Excel表的第一行包含列名,与postgresql表的列名相同):对于每一行,我执行PostgreSQL INSERT查询来自VBA:

[code to connect to the postgresql database using the ADODB driver]

For r = 2 to row_max
       query = transform_row_into_list(r,1,col_max)
       connexion.execute(query)
Next r

函数transform_row_into_list(r,c1,c2)将获取位于列rc1内的Excel表的行c2上的值,并将它们转换为正确的PostgreSQL INSERT查询,例如:

INSERT INTO mytable VALUES (val1, val2, ... ) ;

问题

我的函数transform_row_into_list的定义使用了我创建的另一个函数,称为format_sql,它旨在正确格式化列表的每个值,以便可以正确地插入SQL INSERT查询中。特别是,空白值被转换为" NULL"所以它可以在PostgreSQL表中作为NULL插入。

If x = Empty Then
    format_sql = "NULL"
Exit Function
End If

(在此上下文中,变量x是Variant)。

问题是,我今天注意到如果单元格包含值0,则测试x = Empty将返回True

您可以通过以下方式重现问题:

  1. 创建一个空白Excel文件并将0放在单元格A1中,并将单元格A2留空
  2. 使用以下代码创建一个sub:
  3. test1 = (Range("A1") = Empty)
    
    test2 = (Range("A2") = Empty)
    
    test3 = (Range("A1") = 0)
    
    test4 = (Range("A2") = 0)
    
    Debug.Print test1
    
    Debug.Print test2
    
    Debug.Print test3
    
    Debug.Print test4
    
         

    (很抱歉误用了引用功能,但是我们不会将其格式化为代码)

    所有这些测试都将返回True,而您只希望test2和test3为True。

    因此,对于包含值0的单元格,如何为实际空和的值返回True的逻辑测试?

2 个答案:

答案 0 :(得分:4)

在这种情况下,我可能会使用len函数

If len(x) = 0 then
    format_sql = "NULL"
end if

答案 1 :(得分:2)

像这样写test1

test1 = (IsEmpty(Range("A1")))

没关系。因此,您可以更改If IsEmpty(x) Then

在VBA中查看此Empty - What is the difference between =Empty and IsEmpty() in VBA (Excel)?