ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 胡剑0227

[分享] OFFSET数组化 撞出 array 级别的参数数组化

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-9-27 06:21 | 显示全部楼层
本帖已被收录到知识树中,索引项:OFFSET
  1. Sub 累加()

  2.     Dim sht As Worksheet '定义一个工作表类型的变量 sht
  3.    
  4.     '清空记录总表中的汇总数据,用来当刷新使用
  5.     ThisWorkbook.Worksheets("记录总表").Range("a1").CurrentRegion.Offset(1, 0).Clear   
  6.    
  7.     For Each sht In ThisWorkbook.Worksheets  '对当前工作簿的每个工作表
  8.    
  9.         If sht.Name <> "记录总表" And sht.Name <> "累计" Then  '如果它不是 累计、记录总表
  10.         
  11.             sht.Range("a1").CurrentRegion.Offset(1, 0).Copy _
  12.     Destination:=Worksheets("记录总表").Range("a65536").End(xlUp).Offset(1, 0)  '那么将他们对应的除字段以外的数据 拷贝 衔接到 记录总表 中。
  13.         End If   
  14.     Next
  15. End Sub
复制代码
你的问题主要是多表问题,既然这样,用一段简单的代码先把数据汇总到一个表,然后再用公式处理会是一个不错的方式。

代码要学好是比较难,但论坛中有些常用的实用代码,是一位版主分享的,还有电子书,你可以去看看,照搬一下还是可以接受的。
现在应该算是混合(代码、函数)双打了,呵呵。

函数不是万能的,我们不要限制自己的武器,用自己能用的一切手段去消灭“敌人”,呵呵

另外,我也并不是想什么“功德无量” ,既然你需要,所以我能帮你就帮你。但很多问题我也解决不了,这点也希望你明白,呵呵
==========================================================================================
代码基础知识:
如果发现 记录总表 中的那个 按钮无法执行命令,那么估计你的宏级别设置太高了。
建议:工具-宏-安全性(中)
然后重新打开,在提示对话框中选中启用宏。

完成以上后,按ALT+F11可以进入代码编辑窗口,正常的话左侧列表中有一个 模块1,双击它 就能看到对应的代码了。那个命令能执行这个代码,是因为对他绑定了宏...

[ 本帖最后由 胡剑0227 于 2010-9-27 06:43 编辑 ]

借助代码汇总数据.rar

15.67 KB, 下载次数: 36

TA的精华主题

TA的得分主题

发表于 2010-9-27 08:33 | 显示全部楼层
谢谢胡版主再次回复,我将按照您说的方法去做。
昨天拜读了您的精华帖《[讨论] 有志于成为数组公式高手的不要错过(功力修炼)》后,对MMUTL函数有了初步了解,虽然我把1至1004楼的图文、附件一个不落的全下载了,但还需慢慢消化和转化。最后,万分感谢这几天来,您为我的求助所做的一切努力和费心操劳。再见!

TA的精华主题

TA的得分主题

发表于 2010-9-27 09:46 | 显示全部楼层
第一次看到这个帖子,难怪之前胡版对多维引用有微词,原来自己有创新了。首先申明我非常欢迎创新,并且非常尊重有创新思想的人。但我认为创新也需要严谨。

我认为楼主导语中的三句话都是很有问题的。希望各位网友在学习的时候要注意辨析。

OFFSET函数的返回值是引用区域,当其参数为数组时得到的返回值也是数组,数组的每个元素即是对应的引用区域-----参数驱动

        数组的各引用区域元素是分时隔离的-----分时特性

        使"array"形式的参数数组化成为可能-----参数驱动


首先OFFSET函数的返回值是引用,当其参数为数组时得到的返回值并不是数组,而是多维引用。数组是不能以引用为元素的,但我们可以将多维引用看成是由多个“在同一平面的连续单元格引用”组成的数组。

其次,数组元素需要分时参与计算吗?难道胡版的计算机是第一代的老爷机,打孔的那种,单线程,要一个一个地来处理。同时多重计算的技术都已经是很久远的历史了。

array就是类型为数组的参数,有些函数的参数会直接支持数组,有些参数不能直接支持,如果在其中使用数组,那么需要以三键CTRL+SHIFT+ENTER结束,通知计算机需要对该公式进行多重计算,要知道Excel帮助所谓的多重计算是同时进行的,而不是分时的,否则的话何来多重之有。不要别人用空间来区分多维引用,你就非要造一个概念用时间来区分,而不顾事物的本质。就算是用时间区分,它还叫多维引用,因为时间也是一个维度,维度并非仅是空间上的划分。建议多做些真正有开创性的东西,而不是在这里偷换概念。

参数是数组,本来是很正常的,简单地描述即可,很容易理解,何必造个所谓“数组化”的噱头呢,是不是越玄乎也好?

本来以上三个问题都是刚学数组或多维引用的用户比较容易混淆,一般只要稍微引导一下即可,但胡版作为一代宗师,犯这样的错误,实在难以让人理解。

如果是其他人这种错误,我是不用多说的,因为时间可以纠正他,但胡版犯这种错误,则不行,一定要说,不然影响面太大了,我就当一回坏人吧。

点评

fdd
有争论才有火花,有火花才有真知!留个记号。  发表于 2011-8-25 18:15

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-9-27 09:49 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-9-27 10:08 | 显示全部楼层
呵呵,黄版好。
我也了解到黄版向来是“引经据典”型的,追求文字、用语上的官方化。我是草莽出身,我更关注的是否更易理解,是否能更好地指导实践。因为这个也算实践技能,所以在实践的应用中会自然地进行选择存留。
我也了解到,黄版的重视有很大一部分是怕我误导初学者。说到这点,我真的非常有感触,我能理解黄版的心情。因为我写这个帖,有一大部分原因就是有同学来问我三维、四维问题,问我为什么各个维度在计算时需要独立处理的。我很眩晕,于是就去看黄版的大作了。看到三维、四维的时候我真的头皮有点发毛,后来我沿用自己数组驱动的思想一过,感觉一下子明白黄版要表达的内容了。因为我觉得很多同学在看黄版这个精华帖的时候会眩晕,额外去记忆一些东西,而使用参数驱动的思想,这完全可以轻松地融入其中的,根本用不着搞得这么玄。于是,我觉得我有责任把自己的理解方式介绍给大家,并接受大家检阅。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-9-27 10:22 | 显示全部楼层
原帖由 apolloh 于 2010-9-27 09:46 发表
其次,数组元素需要分时参与计算吗?难道胡版的计算机是第一代的老爷机,打孔的那种,单线程,要一个一个地来处理。同时多重计算的技术都已经是很久远的历史了。


关于分时参与计算,我想可能黄版虽然习惯引经据典,但还是遗漏了。上次我和草版在QQ里进行了较长时间的讨论,草版说,分时处理又是怎么一回事,又造概念。

我说,用使用SUM函数对OFFSET参数数组化的结果进行求值,并返回到多个单元格中。我发现SUM的结果是不同的,而且正好和各个返回的引用的数据求和相一致。所以就这么猜测,并暂时认为是正确的。

讲到OFFSET参数数组化的结果的时候,草版又更正说应该是多维引用(黄版创立的概念,我觉得很不错的名字,能直接给人以空间的感觉,只是在时间上就完全抹杀了),草版说这个就是 “绝对交叉”。
绝对交叉?没听说过,于是虚心请教。草版在谈话快结束的时候草版给我找来了帮助中的说明...出去一下,待续

==========================================================================================
刚刚看到草版的回复,又去904,906楼去看了,感觉前天我又看花眼了,只盯住了“单个单元格来计算”这几个字。

草版提供的帮助中的解释:
帮助文件中的定义:
绝对交集:对单元格区域而不是单个单元格的引用按照单个单元格进行计算。如果单元格 C10 包含公式 =B5:B15*5,则 Excel 将单元格 B10 中的值乘以 5,这是因为单元格 B10 和 C10 位于同一行。


注意】这里是没有按ctrl+shift+enter的计算情况,不妨用=SUM(B5:B15*5)来说更合适,按了三键,成为数组公式,下达多项计算命令之后,“公式求值”过程是完全不一样的。



我现在才发觉那天我和草版辩论的不是一个特性。这个在论坛也叫 “隐含交叉”。这个我也不是很熟,但对这个性质我是知道的。

大家看这个图,就可以知道 我说的分时和草版说的 交叉引用不是一个概念。 INDEX的颗粒问题.jpg
  1. =SUM(INDEX({1,2,3;4,5,6;7,8,9},{1;3}))
复制代码
我这里说的分时是指,公式 INDEX({1,2,3;4,5,6;7,8,9},{1;3})) 的返回值 {1,2,3} 和 {7,8,9} 是分节拍产生的,而这个节拍的划分就是以单元格为单位的。
我和草版在交流中都出现讨论的问题其实不是同一个问题,这说明要真正了解对方再讲什么是挺难的,因为我们脑子里总有一个自己的 思维脉络在引导。

另外,我向黄版说,分时不仅仅是快慢的问题,这里主要是一个按节拍有序的问题。如果黄版猜测我用的计算机是古董,我觉得黄版的思维估计有问题,呵呵。

[ 本帖最后由 胡剑0227 于 2010-9-27 14:56 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-9-27 10:23 | 显示全部楼层
本来理解“多维引用”就需要一定基础的,“数组公式和数据运算”先要学得扎实,才能进一步将它们学好。部分网友,甚至是绝大部分,暂时看不懂是正常的。教科书就算考100分,也未必能全懂的。Excel的技巧,包括函数应用的最佳学习方法是实践,多多的操练,在实际应用中最容易纠正自己认识的偏差,再结合一些理论知识,才能真正做到融会贯通。切忌凭空臆想,力求脚踏实地。

TA的精华主题

TA的得分主题

发表于 2010-9-27 10:30 | 显示全部楼层
胡兄:
1、我第3次一本正经地向您说一下,我说的是“绝对交集”也就是“隐含交叉”,并告诉您在帮助文件的什么地方有这个定义,以及贴图。
2、我说绝对交集的问题,只是针对INDEX,并未针对OFFSET,即:“分时特性”工作表中的这个公式:
=SUM(INDEX(B2:D3,ROW(1:2),0))

这其中,INDEX得到结果的原理,我理解是符合Excel帮助中“绝对交集”定义的内容。关于这部分内容,我已经在您这一帖中904、906楼详细地说明:
http://club.excelhome.net/viewthread.php?tid=431489&page=61#pid3810525

[ 本帖最后由 gouweicao78 于 2010-9-27 10:36 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-9-27 10:39 | 显示全部楼层
很惭愧的承认,前面的帖子我也看得很晕。
把一个概念/理论用通俗的、常规的、有据可循有案可查的词汇或名称来解释,这可以称之为释义解疑。但如果在解释一些概念/理论的时候却创造了新的陌生的词汇和概念,我不认为这是一种真正的简化。

打个比方:
要描述一个未知数X。如果X=a+b,且a,b都已知,那么X就很清晰明了。但如果用X=Y+Z来描述,而且Y、Z同时也是未知数,那么X就还是一个未知数。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-9-27 11:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
呵呵,一个一个来,我会解释的,呵呵
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 22:49 , Processed in 0.039993 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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