ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4493|回复: 22

[求助] 一个数组经过VBA转换后,可以变成任意长宽的数组吗?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-1-11 21:15 | 显示全部楼层 |阅读模式
本帖最后由 飞雪520 于 2018-1-12 11:26 编辑

1.jpg 2.jpg 3.jpg
3种情况.rar (4.21 KB, 下载次数: 6)
实现的程序.rar (3.74 KB, 下载次数: 5)
任意长宽、任意位置的数组,经过VBA转换后,可以变成任意长宽的数组吗?

比如原来是10X10的数组,我想变成5X20
比如原来是25X40的数组,我想变成20X5
。。。无论什么样的数组,我都可以变为任意大小。
同时,我还要按我的心意,以每一行进行转置,还是以每两行进行转置,还是以每三行进行转置。。。

就像这里有一堆砖,是10X10的。我想把它重新堆成20X5的大小。同时,我还要求,以每1行的砖搬过去,或者以每2行的砖搬过去,或者以每3行的砖搬过去。具体要求请看图片的三种要求。




TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-11 21:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如上面三个图:一个数组,可以按我的要求变为任意的数组吗

TA的精华主题

TA的得分主题

发表于 2018-1-11 22:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-1-11 22:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
数组只能相互转置 也就是横着放或竖着放

TA的精华主题

TA的得分主题

发表于 2018-1-11 22:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
数组的维度是根据需要靠自己定义的

TA的精华主题

TA的得分主题

发表于 2018-1-11 22:44 | 显示全部楼层
要务实,落实到实处;具体情况具体分析,因地制宜!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-1-12 08:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
有两种简单的方法可以实现你的要求:
第一种方法:
这种方法比较容易理解,就是重新分配一个新的数组,然后把原数组的数据复制到新的数组内返回。这种方式代码比较容易,但它有几个要注意的问题:
1、原数组不能太大。原数组内存占用到一定的量的时候,因为新的数组也要占用相同大小的内存,当两个数组占用内存超过了VBA内存使用限制时,新的数组无法申请分配的内存——运行时会报错,程序中止;
2、占用时间多。在传送参数和复制数组数据时,所需的时间很长(有时可能会以秒计量)。
第二种方法:
不申请新的内存,通过修改数组结构和原数组中的各元素的位置,直接将原参数的数组转变成最终的结果输出。但是这种方法也有一些比较大的缺点。
1、代码作者必须对数组结构非常了解,保证代码运行时不能出现一点点问题,否则将可能导致非常严重的问题,错误的输出在这里只是微不足道的问题,宿主程序崩溃将是常态;
2、数据转置时需要复杂的计算才能保证以最小的代价将每个元素移动到正确的位置(这一点在你的要求里没有问题,因为你的图片说明你要的只是数组重新分配行列或维数,没有进行转置)。 

上面两种方式总结一下就是:第一种以时间和空间的代价换来简单的代码,第二种以技术换空间和时间。在空间表现上就不说了,一眼就能看出来第一方式至少是第二种方式占用的内存的一倍。而在时间上,第一种方式所需要的时间可能是第二种方式所需的时间千百倍,以楼主第一种要求将一行转成一列来说明,相同的大小的数组用第一种运行一千次可能需要几秒或十几秒,但第二种方式可能运行一千次所耗的时间都不足一毫秒。如果是要修改维数的话,第二种方式的代码更是更方便快捷。

TA的精华主题

TA的得分主题

发表于 2018-1-12 09:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 香川群子 于 2018-1-12 09:18 编辑
joforn 发表于 2018-1-12 08:58
有两种简单的方法可以实现你的要求:
第一种方法:
这种方法比较容易理解,就是重新分配一个新的数组,然 ...

你这考虑太复杂了。

楼主需要的其实很简单,只有2种情况,【拆分】、或【合并】数组。

1. 【拆分】
m行n列的数组结果,拆分为m1行n1列,其中n1<n m1>m 且 m*n=m1*n1  因此 m1=n/n1*m

如第1图和第3图

2.  【合并】
m行n列的数组结果,合并为m2行n2列,其中n2>n m2<m 且 m*n=m2*n2  因此 m2=n/n2*m

如第2图。

…………
做法只能采用你说的第一种方法,
因为楼主提供数据可能就是个字符串,需要拆分字符串来满足要求。

时间问题可以忽略,因为楼主的要求不会太高。

…………
最后,对于楼主说,需要提供Excel文件的附件,而不是图片,才会有人帮你免费写代码。

TA的精华主题

TA的得分主题

发表于 2018-1-12 09:37 | 显示全部楼层
本帖最后由 joforn 于 2018-1-12 09:50 编辑
香川群子 发表于 2018-1-12 09:17
你这考虑太复杂了。

楼主需要的其实很简单,只有2种情况,【拆分】、或【合并】数组。

嗯,就算是字符串,用第二种方式也是一样的快,在数据多的时候第二种方式的速度可能会比用字符串分割再组合快上一万倍。而且楼主问的就是数组,所以我也答数组。
至于你说的拆分和合并,这正是我分析的,我只是把转置一并说了一下,但是在我的回复中,用括号特别说明了楼主的需求不需要转置。
通常我会尽力的考虑得多些,我认为写一段代码并不是只为使用一次,能多方面考虑考虑以后其它的应用中就可以省些力气直接拿来使用。


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-12 11:28 | 显示全部楼层
香川群子 发表于 2018-1-12 09:17
你这考虑太复杂了。

楼主需要的其实很简单,只有2种情况,【拆分】、或【合并】数组。

谢谢版主,已经上传附件了。请帮我看看
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-28 02:00 , Processed in 0.049617 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表