将数字字符转换为字母字符

7

我正在尝试进行以下输入输出操作:

输入:123490
输出:BCDEJA

逻辑很简单:

如果
strarr(i)=0,1,2,3,4,5,6,7,8,9
那么
strarr(i) 应该等于 A,B,C,D,E,F,G,H,I,J

代码

str = .Cells(18, "B").Value
strarr() = Split(str) 
For i = LBound(strarr) To UBound(strarr)
  If strarr(i) = 0 Then
  .Cells(24, "B") = "A" & .Cells(24, "B")
  Else
  If strarr(i) = 1 Then
  .Cells(24, "C") = "B" & .Cells(24, "C")
  Else
  If strarr(i) = 2 Then
  .Cells(24, "C") = "C" & .Cells(24, "C")
  Else
  If strarr(i) = 3 Then
  .Cells(24, "D") = "D" & .Cells(24, "D")
  Else
  .
  .
  .

  If strarr(i) = 9 Then
  .Cells(24, "J") = "J" & .Cells(24, "J")
  Else

  End If x10 times
Next i

.Cells(24, "B") = .Cells(24, "B") & .Cells(24, "C") & .Cells(24, "D") & .Cells(24, "E") & .Cells(24, "F") & .Cells(24, "G") & .Cells(24, "H") & .Cells(24, "I") & .Cells(24, "I") & .Cells(24, "J")

.Cells(18, "D").Value = .Cells(24, "B")

Worksheets("Functions").Rows(24).ClearContents
End With

有人能帮我找出我的错误吗?

关于IT技术的内容

1
每个字母将是 Chr(<数字> + 65) - user4039065
5个回答

10

利用ASCII字符编号(...?)并根据所要转换的数字进行调整。大写字母A是ASCII 0×41或65十进制。

Function num_alpha(str As String)
    Dim sTMP As String, d As Long

    For d = 1 To Len(str)
        sTMP = sTMP & Chr(65 + Mid(str, d, 1))
    Next d

    num_alpha = sTMP

End Function

使用方式与任何本地工作表函数相同。在D18中如下使用:

=num_alpha(B18)

数字转字符


4

我喜欢Jeeped的回答。

以下版本在与某些调整一起使用时可用于播放速度:

  • Mid作为LHS运算符(因为在VBA中连接较慢)
  • 使用Mid$ChrW$

经过我的测试,运行时间缩短了约40%(请参见下面的编辑)

 Function NumChr(strIn As String) As String
        Dim strTemp As String
        Dim lngChar As Long

        For lngChar = 1 To Len(strIn)
            Mid$(strIn, lngChar, 1) = ChrW$(65 + Mid$(strIn, lngChar, 1))
        Next
        NumChr = strTemp
    End Function

编辑:添加测试

  1. 初始代码需要 3.21 秒
  2. 第二个代码需要 1.98 秒

高级协调

  • 在第一个代码中使用 Mid$ 而不是 Mid,将代码从 3.21 秒降至 2.77 秒。
  • 使用 ChrW$ 而不是 Chr,将其从 2.77 秒降至 2.43 秒。
  • 在 LHS 上使用 Mid$,将其降至 1.98 秒

先前的代码

Function num_alpha(str As String)
    Dim sTMP As String, d As Long

    For d = 1 To Len(str)
        sTMP = sTMP & Chr(65 + Mid(str, d, 1))
    Next d

    num_alpha = sTMP

End Function

新代码

Function NumChr(strIn As String) As String
    Dim lngChar As Long

    For lngChar = 1 To Len(strIn)
        Mid$(strIn, lngChar, 1) = ChrW$(65 + Mid$(strIn, lngChar, 1))
    Next
    NumChr = strIn
End Function

测试定时

Sub Main()
Call Test
Call Test2
End Sub

Sub Test()
Dim dbTimer As Double
dbTimer = Timer()
For i = 1 To 1000000
    s = num_alpha("123490")
Next
Debug.Print Timer() - dbTimer
End Sub

Sub Test2()
Dim dbTimer As Double
dbTimer = Timer()
For i = 1 To 1000000
    s = NumChr("123490")
Next
Debug.Print Timer() - dbTimer
End Sub

我从未想过会有如此显著的性能提升。从现在开始,我将在大型变量数组处理中使用这些方法。 - user4039065
我知道这是一个相当老的问题,但我想发表另一种专注于性能的方法。包括NumChr结果进行比较可以吗?附:NumChr的最后一行有一个错别字。 - BrakNicku

3
如Jeeped所说,您可以使用Chr函数将数字转换为字母,使用ASCII码。
另外,当使用一个变量来存储多个值时,建议使用case select模型,以strarr(i)作为控制器,这样可以简化代码并提高可读性。
此外,不要将不同的值写入单元格,应该使用临时变量来存储汇总值,这样可以减少麻烦,并且速度更快,因为您不需要读/写工作表,而是在后台处理。

2
这应该能帮助你入门:
Public Function ConvertValue(iInput As Integer) As String
    ConvertValue = Chr(65 + iInput)
End Function

请注意,值为“65”的字符代表大写字母A,小写字母从“97”开始。

应该使用65而不是64作为显式值,对于他来说A是0,因此使用64会偏差-1。 - Avishay Cohen

2
=CHAR(64 + 1)
will Give "A"
=CHAR(64 + 2)
will Give "B" 
=CHAR(64 + 3)
will Give "C" 

so on.....

1
OP希望他的转换从A = 0开始。你的转换似乎偏离了1个因素。 - user4039065

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接