在VBA中将字母转换为数字

时间:2016-08-09 15:39:21

标签: excel vba excel-vba

寻找一些建议。我在单元格中使用字母和数字组合的单元格值。每个值为6个字母,后跟0000后跟4个字母,然后是5到8个数字。例如。

IIKBAR0000EEEE510002
MQYUQF0000EEEE410003
MWWVIQ0000ZYXW210004
DJHZXL0000BBBB410005

这些或多或少是完全随机的,其中有100k到1,048,576个!

有没有办法可以将字母转换成数字(即A = 1,B = 2,Z = 26等)而不必告诉VBA每个字母的值?我目前使用的代码非常慢,因为它有26个If-Else案例。

2 个答案:

答案 0 :(得分:6)

我认为 UDF 会对您有用:

Option Explicit

Function ConvertLetterToNumber(ByVal strSource As String) As String

Dim i As Integer
Dim strResult As String

For i = 1 To Len(strSource)
    Select Case Asc(Mid(strSource, i, 1))
        Case 65 To 90:
            strResult = strResult & Asc(Mid(strSource, i, 1)) - 64
        Case Else
            strResult = strResult & Mid(strSource, i, 1)
    End Select
Next
ConvertLetterToNumber = strResult

End Function

它会将每个非数字值转换为其Ascii等效值,然后将其降低到其等效字母(A = 1,B = 2等)。只需将其用作常规配方即可。 注意:它假定您的非数字值为大写。

<强>附录

使用第4代i5处理器和8GB RAM,上述代码将在2分钟内返回250,000行。

答案 1 :(得分:1)

这是我写的。无需拨打电话:

Function converttonumber(Column as string) As Long

    Dim A As Integer, currentletter As String

    converttonumber = 0
    For A = 1 To Len(Column)
        currentletter = Mid(Column, Len(Column) - A + 1, 1)
        converttonumber = converttonumber + (Asc(currentletter) - 64) * 26 ^ (A - 1)
    Next

End Function

Sub test()
    Debug.Print converttonumber("AZ")
    Debug.Print converttonumber("E")
    Debug.Print converttonumber("AAA")
End Sub