news 2026/2/13 11:18:07

【理解“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/2/5 20:01:14

Java日志框架,零基础小白到精通,收藏这篇就够了

作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用、WEB应用以及移动应用。然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug;在运行维护阶段,…

作者头像 李华
网站建设 2026/2/5 14:20:35

Linly-Talker在品牌IP形象推广中的创意玩法

Linly-Talker在品牌IP形象推广中的创意玩法 在国潮品牌纷纷推出虚拟代言人的今天,一个关键问题浮出水面:如何以低成本、高效率打造一个“会说话、懂互动、有性格”的数字人IP,并快速应用到直播、短视频、客服等多个场景?传统的3D建…

作者头像 李华
网站建设 2026/2/8 10:03:12

Linly-Talker能否输出透明通道视频?后期合成支持情况

Linly-Talker能否输出透明通道视频?后期合成支持情况 在虚拟主播、在线教育和数字员工等应用日益普及的今天,人们对AI生成内容的质量与灵活性提出了更高要求。一个常被忽视但极为关键的技术细节浮出水面:数字人视频能否支持透明通道&#xff…

作者头像 李华
网站建设 2026/2/5 16:58:08

Linly-Talker如何应对快速语速输入的同步挑战?

Linly-Talker如何应对快速语速输入的同步挑战? 在虚拟主播流畅播报、AI客服实时应答的背后,一场关于“嘴型能不能跟上说话速度”的技术较量正在悄然进行。当用户语速加快,传统数字人系统常出现口型滞后、表情僵硬的问题——声音已经说完&…

作者头像 李华
网站建设 2026/2/8 22:56:02

10种被动收入来源,帮助开发者度过裁员难关

我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我裁员这件事,你在网上看,像一条新闻。 但轮到你自己,它一点都不戏剧化。它很安静。 Slack 进不去了。GitHub 权限没了。…

作者头像 李华
网站建设 2026/2/4 7:01:42

11.CSS属性 (@property)

property规则允许开发者定义自定义CSS属性,具有类型检查、默认值和继承行为控制,创建更强大、可动画的自定义属性。本章概述property是CSS中一个强大的特性,它将自定义CSS属性(CSS变量)提升到了一个新的层次。通过prop…

作者头像 李华