什么是vbNullString,它是如何使用的?

时间:2017-09-01 19:15:57

标签: vba

之间有什么区别
Len(Me.txtStartDate.Value & vbNullString) = 0

Len(Me.txtStartDate.Value) = 0

2 个答案:

答案 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(例如,DateDouble)返回的任何类型之间进行隐式类型转换 字符串连接,因为&运算符仅用于字符串连接,并且该表达式的结果将是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不执行指针,因此函数返回的任何指针 - 从技术上讲 - 都会转换为长整数。ByRefWith确实涉及指针,当然,但隐藏在幕后的方式。)

特别要试试StrPtr(vbNullString);它将返回0。如果您尝试使用StrPtr(""),则会获得一些非零结果。结果是一个指向字符串字符在内存中的位置的指针。但是,指针0表示C(和C ++)中的特殊内容 - 它通常被称为NULL指针(或简称为NULL,或者可能为null),它意味着指针指向无处。在C编程中,有时编码器希望允许指针参数为NULL来表示函数的特殊内容。

如果您连续几次尝试StrPtr(""),则可能会得到一些不同的非零结果。这是因为VBA正在为每次尝试创建一个全新的空字符串,并且看起来任何内存都应该用于空字符串,这很奇怪,请记住VBA中的字符串包含一个长整数,表示字符数字符串。