2015-09-19 17 views
7

Ich versuche, I/O wie folgt zu erhalten:konvertieren numerische Zeichen Buchstaben

Eingang: 123490
Ausgang: BCDEJA

Logik ist einfach:

wenn
strarr(i)=0,1,2,3,4,5,6,7,8,9
dann
strarr(i) should be = A,B,C,D,E,F,G,H,I,J

Code

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 

Kann mir jemand helfen, wo ich falsch bin?

+1

Jeder Buchstabe ist der 'Chr ( + 65)'. – Jeeped

Antwort

10

nutzen Sie die ASCII-Zeichennummern (...?) Und justiere sie mit dem Digi ts, die Sie konvertieren. Ein Kapitol A ist ASCII 0 × 41 oder 65 dez.

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 

Verwenden Sie wie jede native Arbeitsblattfunktion. In D18 wie

=num_alpha(B18) 

Numbers to Characters

3

Wie Jeeped sagte, können Sie die Chr Funktion verwenden, um eine Zahl in einen Buchstaben zu konvertieren, ASCII zu verwenden.

auf einer anderen Note, wenn sie mit einer einzigen Variablen arbeiten, die mehrere Werte haben kann, anstatt so viel if ‚s verwenden würde ich mit einem case select Modell vorschlagen, verwenden strarr(i) als Controller würde es Ihren Code vereinfachen und wäre ein viel lesbarer.

Anstatt die verschiedenen Werte in Zellen zu schreiben, hätte ich auch eine temporäre Variable verwendet, um den aggregierten Wert zu speichern, weniger Aufwand für Sie und ein bisschen schneller, da Sie nicht mehr auf das Blatt lesen und schreiben. re nur

2

im Hintergrund arbeiten Dies sollte Ihnen den Einstieg:

Public Function ConvertValue(iInput As Integer) As String 
    ConvertValue = Chr(65 + iInput) 
End Function 

Bitte beachten Sie, dass Wert von ‚65'stands für Kapital A, beginnen Kleinbuchstaben von '97

+0

sollte 65 und nicht 64 als expliziten Wert verwenden, A für ihn ist 0, also wird 64 mit -1 verwechselt. –

+0

danke, dachte, es beginnt von 1 –

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

so on..... 
+1

Der OP wollte seine Umwandlung ab A = 0. Ihre Umwandlung scheint um einen Faktor von 1 zu sein. – Jeeped

4

mochte ich Jeeped Antwort.

Die Version unten funktioniert auf diesem mit einigen Optimierungen mit der Geschwindigkeit zu spielen:

  • Mid als LHS Operator (als Verkettung in VBA ist langsamer)
  • Verwendung von Mid$ und ChrW$

Bei meiner Prüfung verringerte Laufzeit um ~ 40% (siehe unten)

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 

EDIT: In Tests

  1. 3,21 Sekunden Anfangscode
  2. 1,98 Sekunden für die zweiten Code

hohe Versöhnung

  • Mit Mid$ in ersten Code anstatt Mid nahm Code von 3,21 bis 2,77 Sekunden.
  • Mit ChrW$ statt Chr dauerte es von 2,77 bis 2,43 Sekunden.
  • Verwenden von Mid $ auf der LHS nahm es auf 1,98 Sekunden

vor Code

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 

neuen Code

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 

Test Timing

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 
+0

Ich hatte nie gedacht, dass es einen signifikanten Leistungsschub geben würde. Ich werde ab jetzt diese Methoden in großen Array-Varianten verarbeiten. – Jeeped

+0

Ich weiß, dass das eine ziemlich alte Frage ist, aber ich würde gerne einen anderen Ansatz veröffentlichen, der sich auf die Leistung konzentriert. Ist es in Ordnung, NumChr-Ergebnisse zum Vergleich hinzuzufügen? PS. Es gibt einen Tippfehler in der letzten Zeile von NumChr. – BrakNicku

Verwandte Themen