当前位置: 首页 > news >正文

【理解“Collection存储Union区域后能分两次Resize写入单元格”的核心原因】

要理解“Collection存储Union区域后能分两次Resize写入单元格”的核心原因,需先理清Collection的存储特性Union区域的结构Resize写入的逻辑三者的关系,以下是逐层拆解:

一、核心前提:Collection存储的是“独立的Range对象”,而非合并的Union

你提到的“用Collection添加Union”,实际场景通常是:

DimcolAsNewCollection' 分两次添加两个独立Range(而非直接添加合并后的Union)col.Add Range("A1:A3")' 第一个区域col.Add Range("C1:C2")' 第二个区域' (而非 col.Add Union(Range("A1:A3"), Range("C1:C2")))

这是能“分两次Resize写入”的关键——Collection中存储的是两个独立的Range对象(而非合并后的Union),每个对象都保留了自身的行数、列数和值,因此可逐个取出并单独Resize写入。

二、为什么能“分两次Resize入单元格”?

1. Collection的“有序性+独立存储”

Collection是有序的对象容器,存入的每个Range会被分配独立的索引(如col(1)对应第一个Range,col(2)对应第二个),且每个Range对象的属性(.Rows.Count/.Columns.Count/.Value)完全保留,可单独提取。

2. Resize的“适配性”

Resize(行数, 列数)可根据单个Range的尺寸,精准匹配写入的单元格范围:

  • 若取出的是单行多列Range(如C1:C2是2列1行),则startCell.Resize(1, 2)可刚好容纳该区域的值;
  • 若取出的是多行单列Range(如A1:A3是1列3行),则startCell.Resize(3, 1)可匹配。
3. “连续写入”的逻辑:动态更新起始单元格

分两次写入时,只需在第一次写入后,将起始单元格偏移到已写入区域的下一列/行,即可实现连续拼接,示例如下:

三、完整示例:Collection存储两个Range,分两次Resize连续写入

SubWriteCollectionRangeByResize()DimcolAsNewCollectionDimrng1AsRange,rng2AsRangeDimstartCellAsRangeDimiAsIntegerDimcurrentCellAsRange' 动态更新的写入起点' 1. 初始化两个独立Range,存入CollectionSetrng1=Range("A1:A3")' 3行1列Setrng2=Range("C1:C2")' 1行2列col.Add rng1' 第一个区域(索引1)col.Add rng2' 第二个区域(索引2)' 2. 定义写入起始单元格(如F1)SetstartCell=Range("F1")SetcurrentCell=startCell' 初始起点' 3. 分两次取出Collection中的Range,Resize写入Fori=1Tocol.CountDimtempRngAsRangeSettempRng=col(i)' 取出第i个Range' 关键:根据取出Range的尺寸Resize,写入当前起点currentCell.Resize(tempRng.Rows.Count,tempRng.Columns.Count).Value=tempRng.Value' 更新起点:横向连续(按列偏移),若纵向则改为 .Offset(tempRng.Rows.Count, 0)SetcurrentCell=currentCell.Offset(0,tempRng.Columns.Count)Nexti MsgBox "写入完成!区域:" & startCell.Address & "至 "&currentCell.Offset(0,-1).AddressEndSub

四、对比:Union vs Collection存储的差异

存储方式存储内容能否分两次Resize写入原因
Collection多个独立的Range对象✅ 可以每个Range独立存储,可通过索引逐个取出,单独Resize适配
Union合并后的单个Range对象❌ 直接不行Union是“合并的整体”,遍历需拆解子区域,无法直接按原独立区域分两次取出

五、补充:若Collection中存的是“合并后的Union”,如何分两次写入?

如果Collection中实际存储的是Union(rng1, rng2)(而非两个独立Range),则需先拆解Union的子区域,再分两次写入:

SubWriteUnionFromCollection()DimcolAsNewCollectionDimunionRngAsRange,subRngAsRangeDimstartCellAsRange,currentCellAsRange' 1. Collection中存入合并后的UnionSetunionRng=Union(Range("A1:A3"),Range("C1:C2"))col.Add unionRng' 2. 取出Union并拆解子区域SetstartCell=Range("F1")SetcurrentCell=startCellFor EachsubRngIncol(1)' 遍历Union的子区域(分两次)currentCell.Resize(subRng.Rows.Count,subRng.Columns.Count).Value=subRng.ValueSetcurrentCell=currentCell.Offset(0,subRng.Columns.Count)NextsubRngEndSub

总结

核心原因是:

  1. Collection有序且独立存储每个Range对象,保留了原Range的尺寸和值;
  2. 每次取出一个Range后,可通过Resize匹配其尺寸写入单元格;
  3. 动态更新起始单元格的位置,实现“连续写入”。

而如果是直接存储合并后的Union,需先拆解其子区域(For Each subRng In UnionRng),才能按原区域分两次Resize写入。

http://www.cnnetsun.cn/news/168360.html

相关文章:

  • Linly-Talker如何平衡生成速度与画质清晰度?
  • 基于springboot+vue3的企业人事管理系统设计与实现
  • Linly-Talker支持实时摄像头推流吗?直播推流配置指南
  • Java之网络编程,新书小白入门教学,收藏这篇就够了
  • Linly-Talker能否识别方言输入?ASR模块能力测试
  • Linly-Talker在短视频平台的内容生产提效实证
  • +高校线上心理咨询室设计与实现pf信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • SpringBoot+Vue +疫情物资捐赠和分配系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • 企业级+高校线上心理咨询室设计与实现pf管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 免费在线网盘解析:夸克文件高速下载
  • Git原理与使用
  • 神经网络如何学习:一种概率视角
  • 亲测10款降ai率工具:AI率80%怎么一键降低ai?(2025最新降AIGC避坑指南)
  • PySpark实战 - 2.1 利用Spark SQL实现词频统计
  • PerlinNoise Perlin噪声(PerlinNoise)隐式函数构建模型并渲染
  • Linly-Talker支持模型性能 profiling,精准定位瓶颈
  • Linly-Talker如何处理中英文混读?语音识别适配策略
  • LLM 的思考方式
  • 【虚拟同步机控制建模】三相虚拟同步发电机双环控制(Simulink仿真实现)
  • 万字长文!关于AI绘图,一篇超详细的总结发布
  • 数字人会议主持:Linly-Talker在远程会议中的创新应用
  • 【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)
  • 用Linly-Talker做企业宣传片?品牌传播的AI新路径
  • Electerm(桌面终端模拟软件)
  • Thinkphp和Laravel基于Vue的黄山旅游景区门票预订网站的设计与实现_3h38caai
  • Thinkphp和Laravel基于大数据架构的大学生求职招聘就业岗位推荐系统的设计与实现_67911t4j
  • AI工具实战测评技术
  • 创意AI应用开发大赛技术
  • 全球股市估值与海洋微生物能源技术的关系
  • 基于python的同城宠物照看数据可视化分析系统的设计与实现_34cl0po8--论文