ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

单元格列名和列索引的转换

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-4-27 17:54 | 显示全部楼层 |阅读模式
  1. <blockquote>    Private Shared ReadOnly RADIX As Integer = 26 ' 转换26进制
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-27 17:55 | 显示全部楼层
  1.     Private Shared ReadOnly RADIX As Integer = 26 ' 转换26进制
  2.     Private Shared ReadOnly CODEBASE As Integer = 64  '编码差值 字符 与 值差 64
  3.     ''' <summary>
  4.     ''' 编码: A--Z 表示 0-25 基数,26个数 从 1 开始,也就是说 A-Z ,N+1 表1-26<br/>
  5.     ''' AA--ZZ 表示00到25*26,一共26*26个数,MN ,(M+1)*26+N+1,如AB, 值: (0+1)*26+1+1 = 28<br/>
  6.     ''' AAA--ZZZ 表示000到25*26*26,一共26*26*26个数,PMN (P+1)*26*26+(M+1)*26+N+1<br/>
  7.     ''' AAAA--ZZZZ 表示0000到25*26*26*26,一共26*26*26*26个数,QPMN: (Q+1)*26*26*26+(P+1)*26*26+(M+1)*26+N+1<br/>
  8.     ''' 整数转编码: <see cref="GetCellColName"/> <br/>
  9.     ''' V表示一个整数<br/>
  10.     ''' 1.  N =(V-1) mod 26 ;  V=(V-1)/26 = (Q+1)*26*26+(P+1)*26+(M+1)  ;<br/>   
  11.     ''' 2.  M=(V-1) mod 26 ; V=(V-1)/26 = (Q+1)*26+(P+1);<br/>
  12.     ''' 3.  P=(V-1) mod 26 ; V=(V-1)/26 = (Q+1);<br/>
  13.     ''' 4.  Q=(V-1) mod 26 ; V=(V-1)/26 = 0;<br/>
  14.     ''' 5. V=0 退出计算,转换完成<br/>
  15.     ''' </summary>
  16.     ''' <param name="ColName"></param>
  17.     ''' <returns></returns>
  18.     Public Shared Function GetCellColIndex(ColName As String) As Integer
  19.         Dim charArr As Char() = ColName.ToCharArray()
  20.         Dim ret As Integer = 0
  21.         For Each c As Char In charArr
  22.             ret = ret * RADIX + Strings.Asc(c) - CODEBASE ' N+1
  23.         Next
  24.         Return ret
  25.     End Function
  26.     Public Shared Function GetCellColName(ColIndex As Integer) As String
  27.         Dim sb As New StringBuilder
  28.         Dim modvalue As Integer
  29.         If ColIndex < 1 Or ColIndex >= &H4000 Then Return String.Empty
  30.         While ColIndex > 0
  31.             ColIndex -= 1
  32.             modvalue = ColIndex Mod RADIX
  33.             sb.Append(Chr(modvalue + CODEBASE + 1))
  34.             ColIndex \= RADIX
  35.         End While
  36.         Return Strings.StrReverse(sb.ToString)
  37.     End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2024-4-27 19:24 | 显示全部楼层
  1. Sub test()
  2. Debug.Print GetCol("AA"); GetCol(100)
  3. End Sub
复制代码
  1. Function GetCol(a)
  2. On Error Resume Next
  3. GetCol = IIf(IsNumeric(a), Split(Columns(a).Address(0, 0), ":")(0), Columns(a).Column)
  4. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-27 20:06 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-28 20:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

你那是excel 封装好的,你说我能不知道吗? 那个返回是是range对象,复杂。消耗要大很多的。

TA的精华主题

TA的得分主题

发表于 2024-5-3 12:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 prome3 于 2024-5-3 19:08 编辑

做了一个关于运行速度的测试,结论如下:
1. 单个函数运行一次,不用对象约需 1.3 微秒,用对象约需 3.5 微秒(1微秒=千分之一毫秒=百万分之一秒)。
2. 微软官方给的VBA代码运行最快。
测试结果.png

代码汇总.zip

958 Bytes, 下载次数: 9

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-3 11:12 , Processed in 0.040651 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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