之间有什么区别
Len(Me.txtStartDate.Value & vbNullString) = 0
和
Len(Me.txtStartDate.Value) = 0
答案 0 :(得分:3)
vbNullString
本质上是一个空字符串指针。
Debug.Print StrPtr(vbNullString) 'prints 0
看起来等同于文字""
空字符串,但它不是:
Debug.Print StrPtr("") 'prints an address; 6 bytes are allocated for it
几乎 你的两个例子之间没有区别......只是因为Me.txtStartDate.Value
已经已经一个String
。
如果你这样做:
Debug.Print Sheet1.Range("A1").Value & vbNullString
然后,您将在Sheet1.Range("A1").Value
(例如,Date
或Double
)返回的任何类型之间进行隐式类型转换 字符串连接,因为&
运算符仅用于字符串连接,并且该表达式的结果将是String
。
换句话说,这是一个相当复杂的方法:
Debug.Print CStr(Sheet1.Range("A1").Value)
或者,作为litelite mentioned,这是一种相当复杂的方法:
Len(CStr(Me.txtStartDate.Value)) = 0
您通常使用vbNullString
代替空字符串""
文字,以便无用地分配6个字节(4个用于字符串指针,2个用于空字符),并明确地编写代码明确你的意图(例如“我意味着一个空字符串,这不是一个错字”),类似于你在C#中使用string.Empty
的方式。
答案 1 :(得分:2)
什么是vbNullString
?它是一只奇怪的鸟,它只用于调用用C(或C ++)编写的DLL中的函数。
看看http://vb.mvps.org/tips/varptr/。它描述了VBA(和VB6)中的一组(现在隐藏的)函数,它们只是为了允许将指针传递给变量的内容,而且主要是用于用C语言编写的DLL中的函数(或任何其他语言编写的函数)。指针)。
(从技术上讲,VBA不执行指针,因此函数返回的任何指针 - 从技术上讲 - 都会转换为长整数。ByRef
和With
确实涉及指针,当然,但隐藏在幕后的方式。)
特别要试试StrPtr(vbNullString)
;它将返回0
。如果您尝试使用StrPtr("")
,则会获得一些非零结果。结果是一个指向字符串字符在内存中的位置的指针。但是,指针0表示C(和C ++)中的特殊内容 - 它通常被称为NULL指针(或简称为NULL,或者可能为null),它意味着指针指向无处。在C编程中,有时编码器希望允许指针参数为NULL来表示函数的特殊内容。
如果您连续几次尝试StrPtr("")
,则可能会得到一些不同的非零结果。这是因为VBA正在为每次尝试创建一个全新的空字符串,并且看起来任何内存都应该用于空字符串,这很奇怪,请记住VBA中的字符串包含一个长整数,表示字符数字符串。