You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何VBScript中无Preserve可重定义多维数组,加Preserve却失败?

为什么VBScript中多维数组用ReDim Preserve会失败?

这事儿其实是VBScript的硬性设计限制——当你用Preserve关键字想保留数组原有数据时,只能修改多维数组的最后一维的大小,其他维度动都不能动。而一维数组本身就只有一维,所以用Preserve完全没问题;要是不带Preserve,VBScript会直接扔掉旧数组,重新建个新的,不管你改哪个维度,自然不会报错,但旧数据也就没了。

看你的代码问题出在哪

你报错的那行代码是:

ReDim Preserve marray(UBound(marray)+2, 3)

这里你修改的是数组的第一维(从原来的上限2改成了4),刚好踩中了VBScript的限制,所以直接抛出Subscript out of range的错误。

正确的Preserve用法(只改最后一维)

如果你的数组是marray(2,3),要是想保留数据改大小,只能动最后一维,比如:

' 只扩展最后一维,第一维不动
ReDim Preserve marray(2, 5)

这样就能正常保留原有数据,同时扩展最后一维的长度。

要是必须改非最后一维还想保数据怎么办?

那就得手动做数据迁移了,步骤很简单:

  1. 先创建一个符合你需求的新数组
  2. 循环遍历原数组,把每个元素挨个复制到新数组对应位置
  3. 把新数组赋值给原数组变量

给你改一下你的代码,实现你想要的扩展第一维且保留数据的效果:

Dim marray()
ReDim marray(2,3)
WScript.Echo "marray ubound = " & UBound(marray)
marray(0, 0) = "item 0,0"
marray(0, 1) = "item 0,1"
marray(0, 2) = "item 0,2"
marray(0, 3) = "item 0,3"
marray(1, 0) = "item 1,0"
marray(1, 1) = "item 1,1"
marray(1, 2) = "item 1,2"
marray(1, 3) = "item 1,3"
marray(2, 0) = "item 2,0"
marray(2, 1) = "item 2,1"
marray(2, 2) = "item 2,2"
marray(2, 3) = "item 2,3"

' 输出原数组内容
For Each item In marray
WScript.Echo item
Next

' 手动迁移数据到新数组
Dim newMarray()
Dim oldFirstDim, oldSecondDim, newFirstDim
oldFirstDim = UBound(marray, 1) ' 原数组第一维的上限
oldSecondDim = UBound(marray, 2) ' 原数组第二维的上限
newFirstDim = oldFirstDim + 2 ' 要扩展后的第一维上限

' 创建新数组
ReDim newMarray(newFirstDim, oldSecondDim)

' 循环复制每个元素
Dim i, j
For i = 0 To oldFirstDim
    For j = 0 To oldSecondDim
        newMarray(i, j) = marray(i, j)
    Next
Next

' 替换原数组
marray = newMarray

WScript.Echo "New marray ubound = " & UBound(marray)
' 添加新元素
marray(3, 0) = "item 3,0"
marray(3, 1) = "item 3,1"
marray(3, 2) = "item 3,2"
marray(3, 3) = "item 3,3"
marray(4, 0) = "item 4,0"
marray(4, 1) = "item 4,1"
marray(4, 2) = "item 4,2"
marray(4, 3) = "item 4,3"

' 输出新数组内容
For Each item In marray
WScript.Echo item
Next

最后再划个重点

  • 不带Preserve的ReDim:会销毁原数组,创建全新数组,任意维度都能改,但原有数据会被清空
  • 带Preserve的ReDim:只能修改多维数组的最后一维,改其他维度直接报错,但能保留原有数据
  • 要改非最后一维且保数据:只能手动复制迁移数据,没有捷径

内容的提问来源于stack exchange,提问作者Adriano_Pinaffo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:33:06