当前位置: 首页 > 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.jsqmd.com/news/116455/

相关文章:

  • Linly-Talker生成视频帧率稳定性测试结果公布
  • Linly-Talker在远程办公会议中的虚拟参会应用
  • 前后端分离城市垃圾分类管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 宠物商城网站信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • 黑马微服务 p23Docker02 docker的安装 如何正确安装docker,黑马微服务给的文档不行了,如何正确找到解决方法
  • Linly-Talker在跨国会议同传中的双屏分镜设想
  • Linly-Talker生成视频头部晃动抑制技术说明
  • Linly-Talker动态打光技术如何提升画面质感?
  • 基于SpringBoot+Vue的家具销售商城系统设计与实现
  • Linly-Talker在节庆贺卡定制中的趣味性应用
  • Linly-Talker与MetaHuman相比有何差异?全方位对比
  • 熟悉SFF-8472,SFF-8077i,CFP,MSA,CFP2等光模块协议
  • 前后端分离宠物爱心组织管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • Linly-Talker项目GitHub星标破万背后的五大优势
  • 前端实现视频播放,零基础入门到精通,收藏这篇就够了
  • Linly-Talker语音断句优化策略提升自然度
  • Linly-Talker如何处理长文本输入的上下文连贯性?
  • Linly-Talker能否输出SRT字幕文件?辅助观看功能探讨
  • 49_Spring AI 干货笔记之 OpenAI SDK 图像生成(官方)
  • Java之网络编程,新书小白入门教学,收藏这篇就够了
  • Linly-Talker在电力巡检报告语音播报中的工业应用
  • Linly-Talker如何应对快速语速输入的同步挑战?
  • Linly-Talker在短视频平台的内容生产提效实证
  • Linly-Talker支持竖屏视频输出吗?移动端适配方案
  • Linly-Talker在在线托福雅思培训中的口语陪练应用
  • Linly-Talker训练数据来源是否公开?伦理争议回应
  • Java——输出语句和输入语句,新手小白到精通,收藏这篇就够了
  • Java Web 宠物健康顾问系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • Linly-Talker与Stable Diffusion联动生成虚拟形象
  • 中小企业如何低成本搭建数字人服务?Linly-Talker实战案例