VBA使用Union合并Range区域失败,无法生成包含姓名与技能的二维数组
VBA Union合并多区域赋值数组异常修复方案
问题根源
VBA中将非连续Range对象直接赋值给数组时,默认仅返回Range下第一个子区域(Area)的内容,这是你遇到问题的核心原因:
- 你调用
Application.Union(rngEngineerNames, rngEngSkills)时,第一个参数是姓名列区域,生成的非连续Range第一个子区域是姓名列,所以数组仅拿到姓名数据 - 不用Set关键字给Range变量赋值属于错误语法,相当于隐式读取Range的Value属性传递给Union,此时第一个参数实际是技能区域的内容数组,最终返回的结果自然只有技能数据
修复方案
场景1:姓名列和技能列之间无需要跳过的列
直接选取从姓名列左边界到技能列右边界的整块连续区域即可,无需使用Union,替换原Union相关代码即可:
' 删除原来的Set rngEngSkills = Application.Union(...) 行,替换为以下代码 Set rngEngSkills = .Range(.Cells(iHeaderRow + 1, rngEngineerNames.Column), .Cells(iLastRowSkills, iRightMostSkill)) ' 直接赋值给数组即可拿到完整的27列数据 arrEngSkillCodes = rngEngSkills.Value
场景2:姓名列和技能列之间存在需要跳过的列
此时必须处理非连续区域的问题,可分别读取两个区域的内容后手动拼接数组:
' 分别读取两个区域的内容到数组 Dim arrNames: arrNames = rngEngineerNames.Value Dim arrSkills: arrSkills = rngEngSkills.Value ' 初始化拼接后的数组,行数和原区域一致,列数为姓名列宽度+技能列宽度 Dim arrEngSkillCodes, iRow As Long, iCol As Long ReDim arrEngSkillCodes(1 To UBound(arrNames, 1), 1 To UBound(arrNames, 2) + UBound(arrSkills, 2)) ' 遍历填充数组 For iRow = 1 To UBound(arrNames, 1) ' 填充姓名列 arrEngSkillCodes(iRow, 1) = arrNames(iRow, 1) ' 填充技能列 For iCol = 1 To UBound(arrSkills, 2) arrEngSkillCodes(iRow, 1 + iCol) = arrSkills(iRow, iCol) Next iCol Next iRow
注意事项
所有Range对象的赋值必须使用Set关键字,省略Set属于错误语法,会触发隐式属性调用,导致不可预期的运行结果。
内容的提问来源于stack exchange,提问作者RS123
相关产品推荐
相关产品推荐

