我有一些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)
将获取位于列r
和c1
内的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
。
您可以通过以下方式重现问题:
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的逻辑测试?
答案 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)?