ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] [第53期]EXCEL26进制来回转换 ---------已结

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-9-19 17:36 | 显示全部楼层

邮件已发,楼主查收!

先做了第一题,占位,呵呵~~
现在第二题也做完了,运行时间是原来的约1/20.
图片贴不上来了,时间分别是 .875 和 .046875,呵呵~~
刚刚参加了第52期竞赛题目的回答,又来参加第53期,经常有题做,经常有的玩,有的学真好,谢谢楼主给我们机会!

[ 本帖最后由 trustwxq 于 2009-9-20 11:57 编辑 ]



收到 ——ldy



  1. '论坛ID: trustwxq  Ok +3
  2. '第一题:
  3. Function N2Char26R(ByVal L As String) As Double
  4.     Dim result As Double, m As Integer, n As Integer, str1 As String
  5.     str1 = UCase(L)
  6.     result = 0
  7.     For m = 1 To Len(str1)
  8.         n = Asc(Mid(str1, m, 1)) - Asc("A") + 1
  9.         result = result + n * (26 ^ (Len(str1) - m))
  10.     Next
  11.     N2Char26R = result
  12. End Function
  13. '第二题:
  14. Function N2Char26(ByVal Le As Double) As String
  15.     Dim yushu As Double, zhgshu As Double, transc As String
  16.     zhgshu = Le
  17.     transc = ""
  18.     Do While zhgshu > 26
  19.         yushu = Int(zhgshu / 26)
  20.         yushu = zhgshu - yushu * 26
  21.         zhgshu = Int(zhgshu / 26)
  22.         If yushu = 0 Then
  23.             yushu = 26
  24.             zhgshu = zhgshu - 1
  25.         End If
  26.         transc = Chr(64 + yushu) & transc
  27.     Loop
  28.     If zhgshu = 0 Then
  29.         N2Char26 = transc
  30.     Else
  31.         N2Char26 = Chr(64 + zhgshu) & transc
  32.     End If
  33. End Function
复制代码

[ 本帖最后由 ldy 于 2009-10-21 16:52 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-9-19 21:18 | 显示全部楼层
晕死,抱歉,版主,第一封邮件忘发论坛ID号了。所以重又发了一封,对您造成的不便,请见谅!




收到 ——ldy


  1. '论坛ID了: unsamesky   26的整倍数转换错误   +1分
  2. '字符转数字
  3. Function N2Char26R(ByVal L As String) As Double
  4.     Dim numA As Byte, numB As Double
  5.     Dim i As Byte
  6.     For i = 1 To Len(L)
  7.         numA = Asc(LCase(Mid(L, i, 1))) - 96
  8.         numB = numB + numA * (26 ^ (Len(L) - i))
  9.     Next
  10.     N2Char26R = numB
  11. End Function
  12. '数字转字符
  13. Function N2Char26(ByVal L As Double) As String
  14.    Dim strA As String, numA As Double, numB As Double, numC As Double
  15.    numB = L
  16.    Do While numB > 26
  17.       numA = numB - Int(numB / 26) * 26  '存储余数
  18.       numC = Int(numB / 26)              '存储被除后结果的整数部分
  19.       strA = Chr(numA + 64) & strA       '将余数转换成字母
  20.       numB = numC
  21.    Loop
  22.    N2Char26 = Chr(numB + 64) & strA
  23. End Function
复制代码

[ 本帖最后由 ldy 于 2009-10-21 16:58 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-9-20 07:31 | 显示全部楼层
邮件已于2009.9.20  7:19发送,请版主查收



收到 ——ldy


  1. '论坛ID:smhf_6  结果正确 但速度未达标  +2
  2. Function N2Char26R(ByVal L As String) As Double
  3. '要求不仅限于 2003的IV(256) 和 2007 的XFD(16384列)
  4. '具体要求请运行 验证1
  5. Dim ch%, i%, p%
  6. ch = Len(L)
  7. L = UCase(L)
  8. For i = 1 To ch
  9. p = Application.Lookup(Mid(L, i, 1), [{"A",1;"B",2;"C",3;"D",4;"E",5;"F",6;"G",7;"H",8;"I",9;"J",10;"K",11;"L",12;"M",13;"N",14;"O",15;"P",16;"Q",17;"R",18;"S",19;"T",20;"U",21;"V",22;"W",23;"X",24;"Y",25;"Z",26}])
  10. N2Char26R = N2Char26R + p * 26 ^ (ch - i)
  11. Next
  12. End Function

  13. Function N2Char26(ByVal L As Double) As String
  14. '你的代码 要求EXCEL2003下可运行
  15. '具体要求请运行 验证2
  16.    
  17.      Dim i As Integer
  18.      Dim b(26) As Byte
  19.      Dim s As String
  20.      Do Until L = 0
  21.       '   b(i) = L Mod 26        '  当L>2147483647时出错,“溢出”
  22.           b(i) = L - 26 * Int(L / 26) ' 除26取余
  23.      '    L = L \ 26             '   当L>2147483647时出错,“溢出”
  24.           L = Int(L / 26)
  25.          
  26.           If b(i) = 0 And L > 0 Then
  27.           b(i) = 26
  28.           L = L - 1
  29.           End If
  30.         i = i + 1
  31.      Loop
  32.      Do While i > 0
  33.          i = i - 1
  34.           p = Choose(b(i), "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")
  35.          s = s & p            ' 反序排列
  36.      Loop
  37.      N2Char26 = s
  38. End Function
复制代码

[ 本帖最后由 ldy 于 2009-10-21 17:00 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-9-20 11:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我也来班门弄斧...
占位,邮件已发送,等分...
为什么我的图片无法插入了?





收到 ——ldy





  1. 'Uname:jymao;  OK  +3
  2. Function N2Char26(ByVal L As Double) As String
  3.     Dim s$, c%, d As Double
  4.     If (L > 0) Then
  5.         Do
  6.             d = Application.WorksheetFunction.RoundDown(L / 26, 0)
  7.             c = L - d * 26
  8.             L = d
  9.             If c = 0 Then
  10.                 c = 26
  11.                 L = L - 1
  12.             End If
  13.             s = Chr(c + 64) & s
  14.             If (L < 27) Then
  15.                 If L > 0 Then
  16.                     s = Chr(L + 64) + s
  17.                 End If
  18.                 Exit Do
  19.             End If
  20.         Loop
  21.     End If
  22.     N2Char26 = s
  23. End Function
  24. Function N2Char26R(ByVal L As String) As Double
  25. Dim i%, s$, c%, j
  26.     For i = 1 To Len(L)
  27.         s = UCase(Mid(L, i, 1))
  28.         c = Asc(s)
  29.         If (c > 64 And c < 91) Then
  30.             j = ((c - 64) * 26 ^ (Len(L) - i)) + j
  31.         End If
  32.     Next
  33.     N2Char26R = CDec(j)
  34. End Function
复制代码

[ 本帖最后由 ldy 于 2009-10-21 17:01 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-9-20 13:19 | 显示全部楼层
参与一下,感谢刘版国庆送分

邮件已经发送,请查收



收到 ——ldy



  1. '论坛ID:taller   26的整倍数验证未通过 (26=AZ)   +1
  2. Function N2Char26R(ByVal L As String) As Double
  3.     Dim n As Double, i As Integer, StrLen As Integer
  4.     L = VBA.UCase$(L): StrLen = VBA.Len(L)
  5.     For i = 1 To StrLen
  6.         n = n + (VBA.Asc(VBA.Mid$(L, StrLen + 1 - i, 1)) - 64) * 26 ^ (i - 1)
  7.     Next
  8.     N2Char26R = n
  9. End Function
  10. Function N2Char26(ByVal L As Double) As String
  11.     Dim iMod As Integer, dInt As Double, dNum As Double, sChar As String
  12.     dInt = VBA.Int(L / 26)
  13.     iMod = L - dInt * 26
  14.     Do While dInt > 0
  15.         sChar = VBA.Chr$(64 + IIf(iMod = 0, 26, iMod)) & sChar
  16.         dNum = dInt
  17.         dInt = VBA.Int(dInt / 26)
  18.         iMod = dNum - dInt * 26
  19.     Loop
  20.     If L > 26 Then sChar = VBA.Chr$(64 + IIf(iMod = 0, 26, iMod)) & sChar
  21.     N2Char26 = sChar
  22. End Function
复制代码

[ 本帖最后由 ldy 于 2009-10-21 17:01 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-9-20 13:59 | 显示全部楼层
占位~邮件已发请版主查收!!

收到 ——ldy




  1. '论坛ID: 蓝桥玄霜  OK  +3   
  2. '第16楼
  3. Function N2Char26R(ByVal L As String) As Double
  4. Dim a$, b, suz#, n&, i&
  5. Const zm = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  6. L = UCase(L)
  7. For i = Len(L) To 1 Step -1
  8.     a = Mid$(L, i, 1)
  9.     b = InStr(zm, a)
  10.     suz = suz + b * 26 ^ n
  11.     n = n + 1
  12. Next i
  13. N2Char26R = suz
  14. End Function
  15. Function N2Char26(ByVal L As Double) As String
  16.     Dim iMod As Integer, dInt As Double, sChar As String
  17.     Dim di#, n%
  18.     Const zd = 2147483647
  19.     Const el = 26
  20.     dInt = L
  21.     Do While dInt > zd
  22.         n = n + 1
  23.         If n Mod 2 = 1 Then
  24.             di = Int(dInt / el) * el
  25.             iMod = dInt - di
  26.             dInt = di
  27.             If iMod = 0 Then
  28.                 dInt = dInt - 1
  29.                 sChar = "Z"
  30.             Else
  31.                 sChar = Chr(iMod + 64) & sChar
  32.             End If
  33.         ElseIf Int(dInt / el) > zd Then
  34.             dInt = Int(dInt / el)
  35.             di = Int(dInt / el)
  36.             iMod = dInt - di * el
  37.             dInt = di
  38.             If iMod = 0 Then
  39.                 dInt = dInt - 1
  40.                 sChar = "Z"
  41.             Else
  42.                 sChar = Chr(iMod + 64) & sChar
  43.             End If
  44.         Else
  45.             dInt = Int(dInt / el)
  46.             GoTo 100
  47.         End If
  48.     Loop
  49.     iMod = dInt Mod el
  50.     dInt = Int(dInt / el)
  51.     If iMod > 0 Then
  52.         sChar = Chr(iMod + 64) & sChar
  53.     ElseIf dInt > 0 Then
  54.         dInt = dInt - 1
  55.         sChar = "Z"
  56.     End If
  57. 100:
  58.     Do While dInt > 0
  59.         iMod = dInt Mod el
  60.         dInt = Int(dInt / el)
  61.         If iMod > 0 Then
  62.             sChar = Chr(iMod + 64) & sChar
  63.         Else
  64.             dInt = dInt - 1
  65.             sChar = "Z" & sChar
  66.         End If
  67.     Loop
  68. N2Char26 = sChar
  69. End Function
复制代码

[ 本帖最后由 ldy 于 2009-10-21 17:03 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-9-20 14:24 | 显示全部楼层
占位
邮件已经发送,请查收



[ 本帖最后由 incognito 于 2009-9-20 14:31 编辑 ]


收到 ——ldy




  1. 'Excel Home ID: incognito  Ok +3 -1
  2. '
  3. Function N2Char26r(ByVal L As String) As Double
  4.     Dim Ltr As String
  5.     Dim Catch As String
  6.     Dim F As Integer
  7.     Dim J As Integer
  8.     Dim n As Integer
  9.     L = UCase(L)
  10.     If Not IsNumeric(L) Then
  11. Begin_Proc:
  12.         If Len(L) < 2 Then
  13.             N2Char26r = Asc(L) - 64
  14.         Else
  15.             J = Len(L)
  16.             For n = 1 To Len(L)
  17.                 Ltr = Mid(L, n, 1)
  18.                 Catch = Catch & Ltr
  19.                 If Not IsNumeric(Ltr) Then
  20.                     N2Char26r = N2Char26r + ((Asc(Ltr) - 64) * (26 ^ (J - n)))
  21.                 Else
  22.                     L = Catch
  23.                     GoTo Begin_Proc
  24.                 End If
  25.             Next n
  26.         End If
  27.     Else
  28.         N2Char26r = CInt(L)
  29.         Exit Function
  30.     End If
  31. End Function
  32. Function N2Char26(ByVal L As Double) As String
  33.     Dim CumSum As Variant, InputValue As Variant
  34.     Dim StringPosition As Integer
  35.     Dim i As Integer, Modulus As Integer
  36.     Dim TempString As String, PartialValue As Variant
  37.     On Error GoTo Err_N2Char26
  38.     InputValue = CDec(L)
  39.     If InputValue < 1 Then
  40.         N2Char26 = ""
  41.     Else
  42.         StringPosition = 0
  43.         CumSum = CDec(0)
  44.         TempString = ""
  45.         Do
  46.             PartialValue = Int(CDec((InputValue - CumSum - 1) / (26 ^ StringPosition)))
  47.             Modulus = PartialValue - Int(CDec(PartialValue / 26)) * 26
  48.             TempString = Chr(Modulus + 65) & TempString
  49.             StringPosition = StringPosition + 1
  50.             CumSum = CDec(0)
  51.             For i = 1 To StringPosition
  52.                 CumSum = CDec((CumSum + 1) * 26)
  53.             Next i
  54.         Loop While InputValue > CumSum
  55.         N2Char26 = TempString
  56.     End If
  57.     Exit Function
  58. '邮件内容到此为止,下面两行是我手工添加的,扣 1 分
  59. Err_N2Char26:
  60. End Function
复制代码

[ 本帖最后由 ldy 于 2009-10-21 17:04 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-9-21 11:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好久没参加了,这次参与下。
不过有点担心版主的邮箱又把我的邮箱地址屏蔽掉了,前几次每次都收不到我的邮件

请将N2Char26中的
dInt = CDbl(Split(Format(L / 26, "0.0000000000000000000000"), ".")(0))
改为dInt =Fix(L / 26) ,一直把Fix和int记成不能返回大于Long能表示的最大数的Double
当然,这两种写法在这里的运行结果是一样的,不过下一写法更明了直接

[ 本帖最后由 joforn 于 2009-9-21 12:04 编辑 ]



收到 ——ldy




  1. '论坛ID:Joforn  Ok +3

  2. Function N2Char26R(ByVal L As String) As Double
  3. '你的代码 要求EXCEL2003下可运行
  4. '要求不仅限于 2003的IV(256) 和 2007 的XFD(16384列)
  5. '具体要求请运行 验证1
  6.   Dim byteD() As Byte, I As Long
  7.   Dim dNum As Double
  8.   
  9.   On Error GoTo N2Char26R_Error
  10.   
  11.   If Len(L) Then
  12.     byteD = StrConv(StrConv(L, vbUpperCase), vbFromUnicode)
  13.     For I = LBound(byteD) To UBound(byteD)
  14.       Select Case byteD(I)  '这个主要是判断输入的字符串是否合法,如果只考虑速度或是能保证输入正确性可直接去除。
  15.         Case &H41 To &H5A:  dNum = dNum * 26# + byteD(I) - &H40
  16.         Case Else:          Exit Function
  17.       End Select
  18.     Next I
  19.     Erase byteD
  20.   End If
  21.   N2Char26R = dNum
  22. N2Char26R_Error:
  23. End Function

  24. Function N2Char26(ByVal L As Double) As String
  25.   '你的代码 要求EXCEL2003下可运行
  26.   '具体要求请运行 验证2
  27.   
  28.   Const maxLen As Long = 255 '不用太大,实际上大于217位时Double已经溢出了。
  29.   
  30.   Dim byteD() As Byte, I As Long
  31.   Dim lMod As Long, dInt As Double
  32.   
  33.   
  34.   If L < 1 Then Exit Function
  35.   I = -1: ReDim byteD(maxLen)
  36.   
  37.   Do While L
  38.     If L > 2147483647 Then
  39.       I = I + 1
  40. '      dInt = CDbl(Split(Format(L / 26, "0.0000000000000000000000"), ".")(0))     '去小数部分,0多只是为了防止0.9999999这种变态小数
  41.       dInt = Fix(L / 26)
  42.       lMod = L - dInt * 26#
  43.       If lMod Then
  44.         byteD(I) = lMod + &H40
  45.         L = dInt
  46.       Else
  47.         byteD(I) = &H5A
  48.         L = dInt - 1
  49.      End If
  50.     Else
  51.       '其实直接用上面的循环也可以,不过速度会慢点,好像达不到比原函数快一倍的要求^_^
  52.       Do While L
  53.         I = I + 1
  54.         lMod = L Mod 26
  55.         If lMod Then
  56.           byteD(I) = lMod + &H40
  57.           L = L \ 26
  58.         Else
  59.           byteD(I) = &H5A
  60.           L = L \ 26 - 1
  61.         End If
  62.       Loop
  63.     End If
  64.   Loop
  65.   If I >= 0 Then
  66.     ReDim Preserve byteD(I)
  67.     N2Char26 = StrReverse(StrConv(byteD, vbUnicode))
  68.   End If
  69. End Function
复制代码

[ 本帖最后由 ldy 于 2009-10-21 17:06 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-9-21 13:38 | 显示全部楼层
好久没积分了,凑个热闹。邮件已发,刘兄请查收



收到 ——ldy



  1. '论坛ID:Northwolves  26的整倍数验证未通过 (26=AZ)   +1
  2. Function N2Char26R(ByVal L As String) As Double
  3.     Dim i As Long, n As Long, r As Double
  4.     L = UCase(StrReverse(L))
  5.     n = Len(L)
  6.     For i = 1 To n
  7.         r = r + (Asc(Mid(L, i, 1)) - 64) * 26 ^ (i - 1)
  8.     Next
  9.     N2Char26R = r
  10. End Function
  11. Function N2Char26(ByVal L As Double) As String
  12.     Dim t As Double, s As String, v As String, n As Long
  13.     t = L
  14.     While t > 0
  15.         v = "Z"
  16.         n = t - 26 * Int(t / 26)
  17.         If n Then v = Chr(n + 64)
  18.         s = v & s
  19.         t = Int(t / 26)
  20.     Wend
  21.     N2Char26 = s
  22. End Function
复制代码

[ 本帖最后由 ldy 于 2009-10-21 17:06 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-9-21 20:41 | 显示全部楼层
邮件已发送,请刘版查收,多谢。


收到 ——ldy




  1. '论坛ID:HHAAMM     Ok +3
  2. ' dInt = Int(L / 26.00000000001)
  3. '用这个来处理 26整倍数的问题,很不错。
  4. Function N2Char26R(ByVal L As String) As Double
  5.     Dim a() As Byte, m As Double, i%, j%, t%
  6.     a = UCase(L)
  7.     j = UBound(a)
  8.     t = (UBound(a) + 1) / 2 - 1
  9.     For i = 0 To j Step 2
  10.         m = m + (a(i) - 64) * 26 ^ t
  11.         t = t - 1
  12.     Next
  13.     N2Char26R = m
  14. End Function
  15. Function N2Char26(ByVal L As Double) As String
  16.     Dim m As Double, iMod As Integer, dInt As Double, sChar As String
  17.     m = L
  18.     dInt = Int(L / 26.00000000001)
  19.     iMod = m - dInt * 26
  20.     sChar = Chr(iMod + 64)
  21.     Do While dInt > 0
  22.         m = dInt
  23.         dInt = Int(m / 26.00000000001)
  24.         iMod = m - dInt * 26
  25.         sChar = Chr(iMod + 64) & sChar
  26.     Loop
  27.     N2Char26 = sChar
  28. End Function
复制代码

[ 本帖最后由 ldy 于 2009-10-21 17:07 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-12-4 01:22 , Processed in 0.058904 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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