VBA中ReDim Preserve无法保留数组历史值问题求助
问题分析与解决方案
问题根源
你的代码里myArray()是过程级局部变量,每次点击Remove_CommandButton时,这个数组都会被重新初始化,之前存储的值全部丢失。这才是导致ReDim Preserve无法保留原有值的根本原因,而非ReDim语法本身的问题。另外,循环中移除ListBox项后未调整索引,可能导致漏查后续项。
修正后的代码
' 把数组和计数变量声明为模块级,放在所有过程之外 Dim myArray() As Variant Dim myCount As Integer Private Sub Remove_CommandButton_Click() Dim i As Integer Dim msgString As String ' 先检查输入是否为空 If Trim(myComboBox.Text) = "" Then MsgBox "请输入要移除的值" Exit Sub End If ' 从后往前遍历ListBox,避免移除项后漏查后续内容 For i = myListBox.ListCount - 1 To 0 Step -1 With myListBox If .List(i, 0) = myComboBox.Text Then .RemoveItem i myListBox2.List = myListBox.List ' 同步到第二个列表框 ' 扩展数组并存入当前值 ReDim Preserve myArray(myCount) myArray(myCount) = CStr(myComboBox.Text) myCount = myCount + 1 ' 显示数组当前内容 msgString = Join(myArray, vbCr) MsgBox msgString Exit For ' 找到目标后退出循环,避免重复处理 End If End With Next i myComboBox.Clear ' 清空输入框 End Sub
关键修正点
- 调整变量作用域:将
myArray()和myCount设为模块级变量,确保每次点击按钮时,数组能保留之前存储的所有值。 - 反向遍历列表:从后往前遍历ListBox,解决移除项后后续元素索引前移导致的漏查问题。
- 优化数组扩展逻辑:
ReDim Preserve myArray(myCount)直接扩展到当前计数对应的索引,逻辑更简洁准确。 - 增加输入校验:避免ComboBox为空时执行无效操作。
- 找到值后退出循环:确保每个目标值只被处理一次。
内容的提问来源于stack exchange,提问作者busynessman
相关产品推荐
相关产品推荐

