2009-10-18 83 views
0

鉴于VBA以下语句:
假设val = 4Option Base 0ReDim语句是否使用空字符串初始化字符串数组?

Dim dataStr() As String 
ReDim dataStr(val) 

将ReDim语句初始化字符串数组dataStr至5个空字符串元素(0至4)。
执行ReDim语句后,Array的内容到底是什么。

+1

你可以跳过Dim,只需使用'ReDim dataStr(val)As String'。与'Option Explicit'一起使用。智能感知虽然有些怪异。 – wqw 2009-10-18 12:48:42

+1

您**可以跳过Dim,但VB6手册会警告它。 http://msdn.microsoft.com/en-us/library/aa266231(VS.60).aspx – MarkJ 2009-10-18 21:36:48

回答

1
Sub RedimStringArray() 

Dim Val As Integer 
Dim dataStr() As String 
Dim idx As Long 

    Val = 4 

    ReDim dataStr(Val) 

    For idx = LBound(dataStr) To UBound(dataStr) 
     Debug.Print idx, """" & dataStr(idx); """", TypeName(dataStr(idx)), Len(dataStr(idx)) 
    Next 

End Sub 

给了我这样的:

0   ""   String   0 
1   ""   String   0 
2   ""   String   0 
3   ""   String   0 
4   ""   String   0 

所以我会说,是的,使用ReDim重新初始化与空字符串数组。

+0

为什么“Dim idx As Long”,为什么不“Dim idx As Integer” – 2009-10-18 15:06:40

+1

至少在Win32上的Excel中,Long是“本地”VBA整数类型; Integer只是被转换为Long。因此,默认情况下,通常会将整型变量声明为Long。将一个变量声明为Integer意味着你实际上希望VBA将它当作一个对象,如果将其赋值为32768等会引发溢出错误。 – jtolle 2009-10-18 16:51:16

1

只是为了确认从麦克豪斯的答案,请参阅VBA语言规范的5.4.3.3节:

http://msdn.microsoft.com/en-us/library/dd361851%28PROT.10%29.aspx

在< REDIM语句> 每个阵列根据调整大小尺寸 在其<边界列表中指定。 除非单词“preserve”是 指定,否则阵列中的每个元素都会重置为其数据类型的默认值 , 。

2

您可以阅读VB6 manual page on ReDim

当变量被初始化,一个 可变长度的字符串被初始化 到一个零长度的字符串(“”),和一个 固定长度字符串填充有 零

+0

“固定长度的字符串填充零”听起来很奇怪。我猜“零”是指Chr $(0)。 – onedaywhen 2009-10-19 13:15:41

+0

......固定长度的字符串数组没有初始化为零长度字符串的好处。 – onedaywhen 2009-10-19 13:18:03

+0

是的,它是Chr $(0)。这听起来像VB6运行时用零填充数组的整个内存块。所以数字变为零,指针变为空,但固定长度的字符串变为Chr $(0)。 – MarkJ 2009-10-19 14:41:09