寻找一些建议。我在单元格中使用字母和数字组合的单元格值。每个值为6个字母,后跟0000后跟4个字母,然后是5到8个数字。例如。
IIKBAR0000EEEE510002
MQYUQF0000EEEE410003
MWWVIQ0000ZYXW210004
DJHZXL0000BBBB410005
这些或多或少是完全随机的,其中有100k到1,048,576个!
有没有办法可以将字母转换成数字(即A = 1,B = 2,Z = 26等)而不必告诉VBA每个字母的值?我目前使用的代码非常慢,因为它有26个If-Else案例。
答案 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