ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 通过一题十解谈拓宽编程思路

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-5 11:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:数据类型和基本语句
本帖最后由 doitbest 于 2013-4-5 11:12 编辑
liucqa 发表于 2013-4-5 10:38
对于VBA编程思路讨论,我的观点是这样的:

微软在开发Excel的时候,负责开发工作表功能和负责开发VBA功 ...

我不赞成以血统论人为限制VBA编程的思考方向,代码执行效率、思路多样性、代码编写的繁简度都是我们要综合考虑的。正是因为有了工作表函数等这些所谓“杂牌军”,VBA才有了自己的个性和特色,如果单独追求纯正,VB不是纯正千万倍吗,还要VBA干什么?就我理解,VBA就是一种大众化非专业的编程语言,“不看广告看疗效”,相信任何争论都不会引导VBA编程的发展方向,通俗易懂方便快捷,绝对是广大用户的不二选择。正如宋词代替唐诗,新诗又取代旧体诗一样,这就是规律!

点评

楼上看回答  发表于 2013-4-5 11:19

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-5 11:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
以上发贴中,既有工作表函数解法,也有纯数组解法,这并不代表我非常赞成前者,只是一种考虑和选择而已,关键是一种度的把握。我认为在一种平和的讨论和争鸣中才能生成更多更好的积淀,而不是非此即彼的二分法,各位老师以为如何?

TA的精华主题

TA的得分主题

发表于 2013-4-5 11:35 | 显示全部楼层
doitbest 发表于 2013-4-5 11:07
我不赞成以血统论人为限制VBA编程的思考方向,代码执行效率、思路多样性、代码编写的繁简度都是我们要综合 ...

呵呵,楼主是初学VBA吧。

可以参考一下这个最近新的精华帖。
http://club.excelhome.net/thread-992826-1-1.html


关于VBA,尽管人为限制多样性是没有意义的,
但如果你不是把VBA代码的多样性本身当做追求的目标(舍本求末、买椟还珠)的话,

那么对于某些问题大家都接受并采用一样的高效、标准的解法并非坏事。

…………
并且,事实上好的VBA算法,不可能从你的那些代码例子中得到借鉴。
这个就是我为什么直言你的那些代码没有营养。


…………
最后说,VBA本身有其自身的规律,
凡是套用工作表函数或直接操作单元格的解法,一般说都不可能是好的算法。

有这种喜欢操作单元格想法的人,至少是还没有学好VBA的初级阶段。

TA的精华主题

TA的得分主题

发表于 2013-4-5 11:35 | 显示全部楼层
香川君子的两个例子都不难理解, 第二个代码, 思路很好,数组可考虑碰到特殊性再设置大一些,另外 我一般不用APPLICATION.MAX , 取最大值多个循环

网上有些网友用工作表对象或其他内置对象本身的功能函数来完成任务, 其实这也是微软创造这个特色的EXCEL的初衷. 但如果自己想把这个VBA作为跳板学习 更规范的VB或其他语言的话, 要多用非EXCEL对象本身功能的规范函数或对象, 用过一段时间后,会发现自己水平提高了,程序效率提高了,编个达到同样的目的的程序花的时间并不比用内置功能函数的时间多.    关键在于要习惯下来.

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-4-5 11:43 | 显示全部楼层
VBA虽然不是一个正规的编程工具,

但VBA提供的环境,使得写代码也可以非常接近编程的本质了。


关于【好的算法】,我个人的理解是:
尽量利用计算机计算能力强的特点,写出便于发挥计算机能力的算法代码。
而不是按照人类的思维习惯去解决问题。

一个代码是否便于理解不是问题。(有了足够的经验,水平高了自然就可以理解)




TA的精华主题

TA的得分主题

发表于 2013-4-5 14:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
非常完美!!!

TA的精华主题

TA的得分主题

发表于 2013-4-5 15:28 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-4-5 22:12 | 显示全部楼层
这个方式相当不错,开发思考!

TA的精华主题

TA的得分主题

发表于 2013-4-6 01:17 | 显示全部楼层
yqdaqinqin 发表于 2013-4-5 14:51
非常完美!!!

应该不算完美  
id
1
0.5
2
0.6
3
0.7
2
0.2
3
0.11
4
0.33
1
0.4
2
0.62
3
0.31
3
0.31
3
0.31
2
0.62

以上数据只有第2和第5 是正确的.

还有我的代码还需修改,只考虑最大值4    没有考虑 最小值不是1 ,假如是2或3的情况.

  1. Sub kagawa3()
  2.     Dim i&, j&, k&, m&, n&, r&, t&
  3.     m = Range("A65536").End(3).Row - 1
  4.     arr = Range("A2").Resize(m, 2)
  5.     For i = 1 To m
  6.         If arr(i, 1) > n Then n = arr(i, 1)   '取得最大值
  7.         If arr(i, 1) <= k Then j = j + 1      '取得组合数
  8.         k = arr(i, 1)
  9.     Next
  10.     t = n * (j + 1) + j                       '取得数组实际大小
  11.     ReDim brr(1 To t, 1)
  12.     k = 0
  13.     j = 0
  14.     For i = 1 To t
  15.         r = r + 1
  16.         brr(i, 0) = r
  17.         If r > n Then
  18.             brr(i, 0) = ""
  19.             r = 0
  20.         End If
  21.         If i <= m Then
  22.             If arr(i, 1) <= k Then
  23.                 j = j + 1
  24.             End If
  25.             brr(j * (n + 1) + arr(i, 1), 1) = arr(i, 2)
  26.             k = arr(i, 1)
  27.         End If
  28.     Next
  29.     Range("D1").Resize(t, 2) = brr
  30. End Sub
复制代码




评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-4-6 07:00 | 显示全部楼层
office2008 发表于 2013-4-6 01:17
应该不算完美  
以上数据只有第2和第5 是正确的.

不好意思,我没有看结果!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 18:49 , Processed in 0.040934 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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