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

Vba 什么是vbNullString,它是如何使用的?,vba,Vba,两者有什么区别 Len(Me.txtStartDate.Value & vbNullString) = 0 及 vbNullString本质上是一个空字符串指针 它看起来相当于一个文本”空字符串,但它不是: Debug.Print StrPtr("") 'prints an address; 6 bytes are allocated for it 你的两个例子几乎没有区别。。。但这仅仅是因为Me.txtStartDate.Value已经是字符串 如果您正在这样做: Debug.Pr

两者有什么区别

Len(Me.txtStartDate.Value & vbNullString) = 0


vbNullString
本质上是一个空字符串指针

它看起来相当于一个文本
空字符串,但它不是:

Debug.Print StrPtr("") 'prints an address; 6 bytes are allocated for it
你的两个例子几乎没有区别。。。但这仅仅是因为
Me.txtStartDate.Value
已经是
字符串

如果您正在这样做:

Debug.Print Sheet1.Range("A1").Value & vbNullString
然后,您将通过字符串连接在
Sheet1.Range(“A1”).Value
(例如,
Date
,或
Double
)返回的任何类型之间进行隐式类型转换,因为
&
运算符仅用于字符串连接,该表达式的结果将是一个
字符串

换句话说,这是一种相当复杂的方法:

Debug.Print CStr(Sheet1.Range("A1").Value)
Len(CStr(Me.txtStartDate.Value)) = 0
或者,作为一种相当复杂的方法:

Debug.Print CStr(Sheet1.Range("A1").Value)
Len(CStr(Me.txtStartDate.Value)) = 0


您通常使用
vbNullString
来代替空字符串
文本,以无意义地分配6个字节(4个字节用于字符串指针,2个字节用于空字符),并使代码清楚地了解您的意图(例如,“我指的是空字符串,这不是打字错误”),类似于在C#中使用
string.Empty

vbNullString
本质上是一个空字符串指针

它看起来相当于一个文本
空字符串,但它不是:

Debug.Print StrPtr("") 'prints an address; 6 bytes are allocated for it
你的两个例子几乎没有区别。。。但这仅仅是因为
Me.txtStartDate.Value
已经是
字符串

如果您正在这样做:

Debug.Print Sheet1.Range("A1").Value & vbNullString
然后,您将通过字符串连接在
Sheet1.Range(“A1”).Value
(例如,
Date
,或
Double
)返回的任何类型之间进行隐式类型转换,因为
&
运算符仅用于字符串连接,该表达式的结果将是一个
字符串

换句话说,这是一种相当复杂的方法:

Debug.Print CStr(Sheet1.Range("A1").Value)
Len(CStr(Me.txtStartDate.Value)) = 0
或者,作为一种相当复杂的方法:

Debug.Print CStr(Sheet1.Range("A1").Value)
Len(CStr(Me.txtStartDate.Value)) = 0


您通常使用
vbNullString
来代替空字符串
文本,以无意义地分配6个字节(4个字节用于字符串指针,2个字节用于空字符),并使代码清楚地了解您的意图(例如,“我指的是空字符串,这不是打字错误”),类似于在C#中使用
string.Empty

什么是
vbNullString
?这是一只奇怪的鸟,它的存在仅仅是为了调用用C(或C++)编写的DLL中的函数

看一看。它描述了VBA(和VB6)中的一组(现在隐藏)函数,这些函数的存在仅仅是为了允许将指针传递到变量的内容,同样主要是传递到用C(或任何其他使用指针的语言)编写的DLL中的函数

(从技术上讲,VBA不做指针,因此从技术上讲,函数返回的任何指针都被转换为长整数。
ByRef
With
当然涉及指针,但以隐藏的方式。)

特别是,请尝试
StrPtr(vbNullString)
;它将返回
0
。如果您尝试改为
strprtr(“”
,则会得到一些非零结果。结果是一个指针,指向字符串的字符在内存中的实际位置。然而,指针0在C(和C++)中有特殊的含义——它通常被称为空指针(或者简单地称为空指针,或者可能为空指针),它意味着指针不指向任何地方。在C编程中,有时程序员希望允许指针参数为NULL表示函数的特殊含义


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

什么是
vbNullString
?这是一只奇怪的鸟,它的存在仅仅是为了调用用C(或C++)编写的DLL中的函数

看一看。它描述了VBA(和VB6)中的一组(现在隐藏)函数,这些函数的存在仅仅是为了允许将指针传递到变量的内容,同样主要是传递到用C(或任何其他使用指针的语言)编写的DLL中的函数

(从技术上讲,VBA不做指针,因此从技术上讲,函数返回的任何指针都被转换为长整数。
ByRef
With
当然涉及指针,但以隐藏的方式。)

特别是,请尝试
StrPtr(vbNullString)
;它将返回
0
。如果您尝试改为
strprtr(“”
,则会得到一些非零结果。结果是一个指针,指向字符串的字符在内存中的实际位置。然而,指针0在C(和C++)中有特殊的含义——它通常被称为空指针(或者简单地称为空指针,或者可能为空指针),它意味着指针不指向任何地方。在C编程中,有时程序员希望允许指针参数为NULL表示函数的特殊含义

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

Len(Me.txtStartDate.Value&vbNullString)=0
相当于执行
Len(Me.txtStartDate.Value&“)=0
。我能理解为什么有人会这样做的唯一原因是在传递之前确保值是文本