news 2026/7/5 21:23:11

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【理解“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写入。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 11:59:46

Linly-Talker如何平衡生成速度与画质清晰度?

Linly-Talker如何平衡生成速度与画质清晰度? 在虚拟主播直播间里,用户刚提出问题,数字人几乎立刻转头微笑、张嘴回应,语音流畅自然,唇动与发音严丝合缝,连眼角的细微表情都仿佛带着情绪——这不是科幻电影&…

作者头像 李华
网站建设 2026/7/4 18:24:54

基于springboot+vue3的企业人事管理系统设计与实现

前言 🌞博主介绍:✌CSDN特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发、文档编写、答疑辅导等。✌…

作者头像 李华
网站建设 2026/7/5 3:45:28

Linly-Talker支持实时摄像头推流吗?直播推流配置指南

Linly-Talker 支持实时摄像头推流吗?直播推流配置指南 在虚拟主播、智能客服和在线教育快速发展的今天,一个核心问题摆在开发者面前:我们能否让 AI 数字人真正“活”起来,像真人主播一样面对镜头实时回应观众提问?传统…

作者头像 李华
网站建设 2026/7/4 15:19:14

Java之网络编程,新书小白入门教学,收藏这篇就够了

什么是网络编程 网络编程就是计算机跟计算机之间通过网络进行数据传输 常见软件架构 C/S: Client/Server客户端/服务器 在用户本地需要下载并安装客户端程序,在远程有一个服务器端程序 适合定制专业化的办公类软件如:IDEA、王者荣耀 优缺点: …

作者头像 李华
网站建设 2026/7/3 8:39:44

Linly-Talker能否识别方言输入?ASR模块能力测试

Linly-Talker 能否识别方言输入?ASR 模块能力深度解析 在智能语音助手逐渐走入家庭、政务、教育等场景的今天,一个现实问题日益凸显:当用户操着一口浓重口音说出“今儿个咋这么热哦”,系统还能不能听懂?尤其是在中国这…

作者头像 李华
网站建设 2026/7/5 6:18:31

Linly-Talker在短视频平台的内容生产提效实证

Linly-Talker在短视频平台的内容生产提效实证在抖音、快手、视频号日更成常态的今天,内容创作者正面临一个残酷现实:观众期待越来越高,更新频率越来越快,但人力和时间成本却难以线性增长。一条高质量讲解视频,从脚本撰…

作者头像 李华