2015-09-19 24 views
7

tôi đang cố gắng để có được I/O như sau:Chuyển đổi ký tự số để ký tự chữ

Input: 123.490
Output: BCDEJA

Logic là đơn giản:

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

đang

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 

bất cứ ai có thể giúp tôi ra nơi tôi sai?

+1

Mỗi chữ cái sẽ là 'Chr ( + 65)'. – Jeeped

Trả lời

10

tận dụng các Số ký tự ASCII (...?) Và điều chỉnh chúng bằng digi ts bạn đang chuyển đổi. Thủ đô A là ASCII 0 × 41 hoặc 65 tháng 12.

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 

Sử dụng như bất kỳ chức năng bảng tính gốc nào. Trong D18 như,

=num_alpha(B18) 

Numbers to Characters

3

Khi Jeeped cho biết bạn có thể sử dụng chức năng Chr để chuyển đổi một số thành một chữ cái, sử dụng ASCII.

trên một lưu ý, khi làm việc với một biến duy nhất mà có thể có nhiều giá trị, thay vì sử dụng quá nhiều if 's tôi sẽ đề nghị sử dụng một mô hình case select, sử dụng strarr(i) như bộ điều khiển nó sẽ đơn giản hóa mã của bạn và sẽ là một rất dễ đọc hơn.

Ngoài ra, thay vì viết các giá trị khác nhau cho ô, tôi đã sử dụng biến tạm thời để lưu trữ giá trị tổng hợp, ít rắc rối hơn cho bạn và nhanh hơn một chút khi bạn không đọc/ghi vào trang tính thay cho bạn ' tái chỉ làm việc trong nền

2

Điều này sẽ giúp bạn bắt đầu:

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

Xin lưu ý rằng giá trị của '65'stands vốn A, chữ thường bắt đầu từ '97

+0

nên sử dụng 65 và không 64 như giá trị rõ ràng, A cho anh ta là 0 nên sử dụng 64 bạn sẽ bị đánh dấu bằng -1. –

+0

cảm ơn bạn, nghĩ rằng nó bắt đầu từ 1 –

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

so on..... 
+1

OP muốn chuyển đổi của mình bắt đầu từ A = 0. Chuyển đổi của bạn dường như bị tắt bởi hệ số 1. – Jeeped

4

Tôi thích câu trả lời của Jeeped.

Các phiên bản dưới đây làm việc về vấn đề này với một số tinh chỉnh để chơi với tốc độ:

  • Mid như một nhà điều hành LHS (như nối trong VBA là chậm hơn)
  • sử dụng Mid$ChrW$

Khi thử nghiệm của tôi giảm thời gian chạy xuống ~ 40% (xem các chỉnh sửa bên dưới)

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: Thêm kiểm tra

  1. 3,21 giây cho mã ban đầu
  2. 1,98 giây cho mã thứ hai

hòa giải cấp cao

  • Sử dụng Mid$ trong mã đầu tiên thay vì Mid lấy mã từ 3,21 đến 2,77 giây.
  • Sử dụng ChrW$ thay vì Chr mất từ ​​2,77 đến 2,43 giây.
  • Sử dụng trung $ trên LHS lấy nó để 1,98 giây

đang trước

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 

mã mới

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 

kiểm tra thời gian

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

Tôi chưa bao giờ nghĩ rằng sẽ có hiệu suất đáng kể. Tôi sẽ bắt đầu sử dụng các phương pháp này trong xử lý mảng biến thể lớn kể từ bây giờ. – Jeeped

+0

Tôi biết đây là câu hỏi khá cũ, nhưng tôi muốn đăng một cách tiếp cận khác tập trung vào hiệu suất. Có OK để bao gồm các kết quả NumChr để so sánh không? PS. Có một lỗi đánh máy trong dòng cuối cùng của NumChr. – BrakNicku

Các vấn đề liên quan