2015-09-19 17 views
7

sayısal karakterler dönüştürme:Ç G/I almaya çalışıyorum alfabetik karakterler

Girdi: 123490
Çıktı: BCDEJA

Mantık basittir:


eğer

strarr(i) should be = A,B,C,D,E,F,G,H,I,J

kod

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 

Yanlış nerede kimse bana yardım edebilir?

+1

Her harf 'Chr ( + 65)' olacaktır. – Jeeped

cevap

10

iyi kullanın başlamak ASCII karakter sayıları (...?) Ve bunları digi ile ayarlayın dönüştürüyorsun. Bir A numaralı bir sermaye ASCII 0 × 41 veya 65 dec'dir.

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 

Herhangi bir yerel çalışma sayfası işlevi gibi kullanın. D18 ise

=num_alpha(B18) 
3

Jeeped'in dediği gibi, ASCII kullanarak bir sayıyı bir harfe dönüştürmek için Chr işlevini kullanabilirsiniz. yerine çok if 'Ben bir case select modeli kullanılarak öneririm s kullanmak yerine, birden fazla değere sahip tek bir değişken ile çalışan başka bir kayda üzerinde

, bu kodu basitleştirmek olur denetleyici olarak strarr(i) kullanabilir ve olacağını çok daha okunabilir.

Ayrıca, farklı değerleri hücrelere yazmak yerine, biriktirilmiş değeri depolamak için geçici bir değişken, sizin için daha az güçlük ve daha hızlı bir şekilde kullanıp sayfayı okumaz/yazmazsınız. sadece arka

2

çalışan yeniden bu almalısınız başlamanıza:

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

sermaye A için 65'stands' o değeri unutmayın, küçük harfler arasında '97

+0

, 65 değerini değil, açık değeri 64 olarak kullanmalıdır, A değeri 0'dır, bu yüzden 64 kullanarak, -1 ile işareti kapalı olacaktır. –

+0

Teşekkür ederiz, 1 –

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

so on..... 
+1

tarihinden itibaren başlıyor. OP'in dönüşümünün A = 0'dan başlayan olmasını istedi. Dönüşümünüzün 1 faktörüne uygun olduğunu düşünüyoruz. – Jeeped

4

Numbers to Characters

, ben Jeeped cevabını sevdim.

bazı düzeltmelerle birlikte bu konuda aşağıda versiyonu çalışır hız ile oynamak için

: Bir LHS operatörü olarak

  • Mid
  • Mid$ kullanımı ve ChrW$
(VBA birleştirme yavaştır gibi)

Testimde daha düşük çalışma süresi ~% 40 (bkz. Aşağıdaki düzenlemeler)

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 

DÜZENLEME: Ekle testler

  1. 3,21 saniye ilk kod için ilk kod Mid$ kullanarak ikinci kod

yüksek uzlaşma

  • için
  • 1.98 saniyeyerine 210, kodu 3.21'den 2.77 saniyeye çıkardı.
  • Chr yerine ChrW$ kullanmak, 2.77 - 2.43 saniye sürdü.
  • lhs Orta $ 1.98 saniye

önce kod

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 

Yeni kod

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 

testi zamanlama

için aldı kullanma
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

Daha önce hiç bu kadar önemli bir performans artışı olacağını düşünmemiştim. Şu andan itibaren büyük varyant dizi işlemede bu yöntemleri kullanmaya başlayacağım. – Jeeped

+0

Bunun çok eski bir soru olduğunu biliyorum, ancak performansa odaklı başka bir yaklaşım göndermek istiyorum. Karşılaştırma için NumChr sonuçlarını eklemek tamam mı? PS. NumChr'in son satırında bir yazım hatası var. – BrakNicku

İlgili konular