ExcelHome技术论坛

 找回密码
 免费注册
QQ登录 只需一步,快速开始
   
高效办公必会的Office99uu优优 永久免费,网表让Excel秒变数据库 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel函数公式学习大典 资深财务总监教您玩转Excel 免费下载Excel行业应用视频
300集Office 2010微99uu优优 Tableau-数据可视化工具 突破Excel限制,用活字格提高效率 13门Excel免费公开课任你学
你的Excel 201099uu优优学习锦囊 欲罢不能, 过目难忘的 Office 新界面 免费的Excel考勤计算系统
查看: 397|回复: 22
打印 上一主题 下一主题

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

[复制链接]
TA的精华主题TA的得分主题
跳转到指定楼层
1
发表于 2018-1-11 21:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 飞雪520 于 2018-1-12 11:26 编辑


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

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

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




TA的精华主题TA的得分主题
2
 楼主| 发表于 2018-1-11 21:16 | 只看该作者
如上面三个图:一个数组,可以按我的要求变为任意的数组吗
TA的精华主题TA的得分主题
3
发表于 2018-1-11 22:40 | 只看该作者
按照你的意思   应该是不可以的

评分

参与人数 1鲜花 +1 收起 理由
飞雪520 + 1 已经上传附件了。请帮我看看
查看全部评分
TA的精华主题TA的得分主题
4
发表于 2018-1-11 22:41 | 只看该作者
TA的精华主题TA的得分主题
5
发表于 2018-1-11 22:42 | 只看该作者
TA的精华主题TA的得分主题
6
发表于 2018-1-11 22:44 | 只看该作者
要务实,落实到实处;具体情况具体分析,因地制宜!

评分

参与人数 1鲜花 +1 收起 理由
飞雪520 + 1 已经上传附件了。请帮我看看
查看全部评分
TA的精华主题TA的得分主题
7
发表于 2018-1-12 08:58 | 只看该作者
有两种简单的方法可以实现你的要求:
第一种方法:
这种方法比较容易理解,就是重新分配一个新的数组,然后把原数组的数据复制到新的数组内返回。这种方式代码比较容易,但它有几个要注意的问题:
1、原数组不能太大。原数组内存占用到一定的量的时候,因为新的数组也要占用相同大小的内存,当两个数组占用内存超过了VBA内存使用限制时,新的数组无法申请分配的内存——运行时会报错,程序中止;
2、占用时间多。在传送参数和复制数组数据时,所需的时间很长(有时可能会以秒计量)。
第二种方法:
不申请新的内存,通过修改数组结构和原数组中的各元素的位置,直接将原参数的数组转变成最终的结果输出。但是这种方法也有一些比较大的缺点。
1、代码作者必须对数组结构非常了解,保证代码运行时不能出现一点点问题,否则将可能导致非常严重的问题,错误的输出在这里只是微不足道的问题,宿主程序崩溃将是常态;
2、数据转置时需要复杂的计算才能保证以最小的代价将每个元素移动到正确的位置(这一点在你的要求里没有问题,因为你的图片说明你要的只是数组重新分配行列或维数,没有进行转置)。 

上面两种方式总结一下就是:第一种以时间和空间的代价换来简单的代码,第二种以技术换空间和时间。在空间表现上就不说了,一眼就能看出来第一方式至少是第二种方式占用的内存的一倍。而在时间上,第一种方式所需要的时间可能是第二种方式所需的时间千百倍,以楼主第一种要求将一行转成一列来说明,相同的大小的数组用第一种运行一千次可能需要几秒或十几秒,但第二种方式可能运行一千次所耗的时间都不足一毫秒。如果是要修改维数的话,第二种方式的代码更是更方便快捷。
TA的精华主题TA的得分主题
8
发表于 2018-1-12 09:17 | 只看该作者
本帖最后由 香川群子 于 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的得分主题
9
发表于 2018-1-12 09:37 | 只看该作者
本帖最后由 joforn 于 2018-1-12 09:50 编辑
香川群子 发表于 2018-1-12 09:17
你这考虑太复杂了。

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

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


评分

参与人数 1鲜花 +1 收起 理由
飞雪520 + 1 谢谢版主,已经上传附件了。请帮我看看
查看全部评分
TA的精华主题TA的得分主题
10
 楼主| 发表于 2018-1-12 11:28 | 只看该作者
香川群子 发表于 2018-1-12 09:17
你这考虑太复杂了。

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

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

最新热点上一条 /1 下一条

关注官方微信,每天学会一个新技能
手机版|关于我们|联系我们|ExcelHome GMT+8, 2018-4-24 09:14 , Processed in 0.784358 second(s), 14 queries , Gzip On, MemCache On.
Powered by Discuz! X3.4 © 2001-2017 Wooffice Inc.
    沪公网安备 31011702000001号 沪ICP备11019229号 本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师
快速回复 返回顶部 返回列表
99uu优优