VBA如何将单元格内指定的多个分散单元格/区域值存入数组
VBA 多地址单元格值转数组实现方案
你写的代码无法运行,核心问题有两个:
- 变量声明写错了:
Dim x() As Array是非法语法,存单元格值的变量直接声明为Variant就行,不用提前加数组括号,多区域返回的值结构不固定,固定数组类型反而会报错。 - 取值逻辑不对:VBA的
Range对象只认英文逗号分隔的多区域地址,你A1里用中文顿号分隔地址肯定会识别失败;就算替换了分隔符,非连续多区域直接调用.Value也只会返回第一个区域的内容,拿不到全部单元格的值。
可直接运行的代码
Sub GetRangeValuesFromAddr() Dim resultArr() As Variant, subArea As Range Dim addrText As String, idx As Long, totalCells As Long ' 读取A1的地址文本,把中文顿号替换成VBA能识别的英文逗号联合运算符 addrText = Replace(Range("A1").Value, "、", ",") ' 先统计所有地址覆盖的单元格总数,初始化结果数组 totalCells = 0 For Each subArea In Range(addrText).Areas totalCells = totalCells + subArea.Cells.Count Next ReDim resultArr(1 To totalCells) ' 遍历所有子区域,把值按顺序写入数组 idx = 1 For Each subArea In Range(addrText).Areas If subArea.Cells.Count = 1 Then ' 单个单元格直接赋值 resultArr(idx) = subArea.Value idx = idx + 1 Else ' 连续区域先读为二维数组,再逐单元格写入结果 Dim areaVals As Variant, r As Long, c As Long areaVals = subArea.Value For r = 1 To UBound(areaVals, 1) For c = 1 To UBound(areaVals, 2) resultArr(idx) = areaVals(r, c) idx = idx + 1 Next Next End If Next ' 这里resultArr就是存了所有目标值的一维数组,索引从1开始,按地址书写顺序排列 ' 测试:可按Ctrl+G打开立即窗口查看所有值 For idx = 1 To UBound(resultArr) Debug.Print resultArr(idx) Next End Sub
注意事项
- 代码自动兼容单个单元格、连续区域、混合地址三种写法,只要A1里写的是合法的Excel单元格地址就能正常读取
- 如果你的A1里本来就是用英文逗号分隔地址,直接删掉
Replace那行的替换逻辑即可 - 最终返回的是打平的一维数组,如果需要保留原区域的行列二维结构,可以根据业务需求调整数组的存储维度,上述写法是通用的无硬编码方案,不需要提前固定地址位置。
内容的提问来源于stack exchange,提问作者TheEditingify
相关产品推荐
相关产品推荐

