ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] Excel列数字转换成字母的VBA递归算法

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-5 23:31 | 显示全部楼层
dcanoe 发表于 2023-2-5 21:08
楼主已经很厉害了,赞一个

感谢支持!还在学习。

TA的精华主题

TA的得分主题

发表于 2023-2-6 07:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-2-6 11:10 | 显示全部楼层
本帖最后由 zldccmx 于 2023-2-6 11:11 编辑

So easy!
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-6 11:26 来自手机 | 显示全部楼层
zldccmx 发表于 2023-2-6 11:10
So easy!

主要是为了学习递归,你的方法也非常好!

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-6 11:30 来自手机 | 显示全部楼层
今铭昔 发表于 2023-2-6 07:52
我也写个尾递归的方式,VBA和JSA

虽然看不懂,但觉得非常棒!不明觉棒,哈哈!

TA的精华主题

TA的得分主题

发表于 2023-2-6 19:24 | 显示全部楼层
供参考:
  1. ' 给定一个正整数,根据EXCEL列名规则(26进制)返回对应的字母
  2. ' 1->A...Z->26...AA->27...ZY->701...FXSHRXW->2147483647
  3. Sub ColAddr()
  4. Const ColNum = 2147483647
  5. Debug.Print ToColAddr(ColNum)
  6. End Sub

  7. Function ToColAddr$(n&, Optional Addr$)   ' Tail_Recursion
  8. Dim m&
  9. m = n Mod 26
  10. If CBool(n) Then
  11.     ToColAddr = ToColAddr(n \ 26 + CLng(m = 0), Chr(64 + IIf(m, m, 26)) & Addr)
  12. Else
  13.     ToColAddr = Addr
  14. End If
  15. End Function
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-2-7 09:06 | 显示全部楼层
wanao2008 发表于 2023-2-6 11:30
虽然看不懂,但觉得非常棒!不明觉棒,哈哈!

计算方法都是一样的,这里只是用一个参数保存每次的递归结果,当递归停止条件成立时,返回这个参数就可以了。尾递归是递归的一种形式,编译器会针对这种情况进行优化,递归都会有内存栈开销,如果递归深度太大,性能会越来越差,并伴随着爆栈的风险。但是尾递归却只会有一个栈帧,尾递归与普通循环的效率差不了多少。

TA的精华主题

TA的得分主题

发表于 2023-3-22 19:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

看了老师的代码,有一个不理解的地方,1 mod 26为什么要取1?如果是2 mod 26,这时2/26是无限循环小数,这时该怎样取余数呢?

TA的精华主题

TA的得分主题

发表于 2023-3-22 19:57 | 显示全部楼层
cui26896 发表于 2023-3-22 19:02
看了老师的代码,有一个不理解的地方,1 mod 26为什么要取1?如果是2 mod 26,这时2/26是无限循环小数,这 ...

1.首先, 所有人的代码都是反斜线:“\”,不是“/",也就是整除,忽略小数,这两个是不同的。所以--> 2 \ 26=0 , 27 \ 26 = 1。
2.另外,取余是相对于整数除法来说的,只有能整除或不能整除两种情况,不能整除时,就有余数。所以--> 2 mod 26=2,28 mod 26 = 2。
3.至于原理和10进制转2进制一样,都是辗转相除法(或者叫欧几里得算法,如果不清楚可以搜一下),只不过这里相当于26进制。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-12-10 00:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wanao2008 发表于 2023-2-5 23:23
躺在床上睡不着,优化一下代码:
Function GetColumnStr(n&) As String
    If n > 26 Then

能写个把数据转成128条形码的函数,与一个宏代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-28 18:55 , Processed in 0.049910 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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