2015-09-19 21 views
7

Sto cercando di ottenere I/O come segue:Convertire caratteri numerici a caratteri alfabetici

ingresso: 123.490
uscita: BCDEJA

La logica è semplice:

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

codice

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 

Qualcuno mi può dare una mano in cui mi sbaglio?

+1

Ogni lettera sarà il 'Chr ( + 65)'. – Jeeped

risposta

10

Fare uso del Numeri di caratteri ASCII (...?) E regolarli con il digi ts stai convertendo. Un capitol A è ASCII 0 × 41 o 65 dec.

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 

Usa come qualsiasi funzione del foglio nativa. In D18 come,

=num_alpha(B18) 

Numbers to Characters

3

Come Jeeped ha detto che è possibile utilizzare la funzione Chr per convertire un numero in una lettera, utilizzando ASCII.

In un'altra nota, quando si lavora con una sola variabile che può avere più valori, invece di usare tanto if 's Io suggerirei di usare un modello case select, utilizzare strarr(i) come il controller sarebbe semplificare il codice e sarebbe un molto più leggibile.

Inoltre, invece di scrivere i diversi valori sulle celle, avrei usato una variabile temporanea per memorizzare il valore aggregato, meno problemi per te e un po 'più veloce dato che non leggi/scrivi sul foglio invece tu " basta lavorare in background

2

Questo dovrebbe iniziare:

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

si prega di notare che il valore di '65'stands per il capitale a, lettere minuscole partono dal '97

+0

dovrebbe usare 65 e non 64 come valore esplicito, A per lui è 0, quindi usando 64 sarai fuori dal segno di -1. –

+0

grazie, ho pensato che inizi dal 1 –

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

so on..... 
+1

L'OP voleva che la conversione iniziasse da A = 0. La tua conversione sembra essere inattiva di un fattore di 1. – Jeeped

4

mi è piaciuta la risposta di Jeeped.

La versione di seguito funziona su questo con alcuni ritocchi di giocare con la velocità:

  • Mid come operatore LHS (come la concatenazione in VBA è più lento)
  • uso di Mid$ e ChrW$

Sul mio test ridotto run-time di ~ 40% (vedere le modifiche di seguito)

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: Aggiungere test

  1. 3,21 secondi per il codice iniziale
  2. 1,98 secondi per il secondo codice

alto livello riconciliazione

  • Utilizzando Mid$ in primo codice piuttosto che Mid ha preso il codice da 3,21 a 2,77 secondi.
  • L'utilizzo di ChrW$ anziché Chr l'ha preso da 2,77 a 2,43 secondi.
  • Utilizzo Mid $ sul lato sinistro presero a 1,98 secondi

prima di codici

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 

nuovo codice

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 

tempi di prova

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

Non avevo mai pensato che ci sarebbe stato un significativo incremento delle prestazioni. D'ora in poi inizierò a utilizzare questi metodi nell'elaborazione di array di varianti di grandi dimensioni. – Jeeped

+0

So che questa è una domanda piuttosto vecchia, ma vorrei pubblicare un altro approccio incentrato sulle prestazioni. Va bene includere i risultati di NumChr per il confronto? PS. C'è un refuso nell'ultima riga di NumChr. – BrakNicku

Problemi correlati