Giúp đỡ hàm thay thế các ký twj số thành các ký tụ chũ

  • Thread starter Thread starter NGOCTOAN
  • Ngày gửi Ngày gửi
Liên hệ QC

NGOCTOAN

Thành viên hoạt động
Tham gia
1/8/06
Bài viết
104
Được thích
33
Gửi : Các ACE GPE,

Nhờ các anh chi giúp hoàn thiện hàm sau vì em làm mà không thay thế được ký tự:

Function so_text(chuoi As String) As String
Dim i, n As Byte
Dim so, so1, so2 As String
n = Len(chuoi)
so2 = ""
If n > 0 Then
For i = 1 To n
so1 = Mid(chuoi, i, 1)
Select Case so1
Case so1 = "1": so = "a"
Case so1 = "2": so = "b"
Case so1 = "3": so = "c"
Case so1 = "4": so = "d"
Case so1 = "5": so = "e"
Case so1 = "6": so = "f"
Case so1 = "7": so = "g"
Case so1 = "8": so = "h"
Case so1 = "9": so = "i"
Case so1 = "0": so = "j"
End Select
so2 = so2 + so
Next i
End If
so_text = so2
End Function


File kèm
Cảm ơn Các Anh Chị.
Ngọc toàn.
 

File đính kèm

Xin hỏi chuỗi cần đổi của bạn chỉ có số không thôi hay cả chữ nữa.
 
Bạn sửa hàm lại chút thế này nhé
Mã:
Function So_text(Chuoi As String) As String
Dim i, n As Byte
Dim So As String, So1 As String, So2 As String
n = Len(Chuoi)
So2 = ""
So = ""
If n > 0 Then
For i = 1 To n
     So1 = Mid$(Chuoi, i, 1)
        Select Case So1
            Case "1": So = "a"
            Case "2": So = "b"
            Case "3": So = "c"
            Case "4": So = "d"
            Case "5": So = "e"
            Case "6": So = "f"
            Case "7": So = "g"
            Case "8": So = "h"
            Case "9": So = "i"
            Case "0": So = "j"
        End Select
    So2 = So2 + So
Next i
End If
So_text = So2
End Function
 
Bạn sửa hàm lại chút thế này nhé
Mã:
Function So_text(Chuoi As String) As String
Dim i, n As Byte
Dim So As String, So1 As String, So2 As String
n = Len(Chuoi)
So2 = ""
So = ""
If n > 0 Then
For i = 1 To n
     So1 = Mid$(Chuoi, i, 1)
        Select Case So1
            Case "1": So = "a"
            Case "2": So = "b"
            Case "3": So = "c"
            Case "4": So = "d"
            Case "5": So = "e"
            Case "6": So = "f"
            Case "7": So = "g"
            Case "8": So = "h"
            Case "9": So = "i"
            Case "0": So = "j"
        End Select
    So2 = So2 + So
Next i
End If
So_text = So2
End Function

Dạ đúng rồi ạ. Anh Giai phap có thể giải thích hộ sự khác nhau hàm Mid và Mid$ trong VBA được không ạ.

Cảm ơn Anh

Ngoctoan.
 
Hàm Mid thì trả về kiểu variant còn Mid$ trả về kiểu chuỗi, cái chính thì bạn sai ở chổ Case
 
Bạn xem File đính kèm, anh Giaiphap làm cho bạn rồi nhưng mình cũng upFile lên cho bạn test thử trường hợp nếu chuỗi chứa cả chữ xen lẫn số
 

File đính kèm

Rút gọn lại Code trên thành như vầy cho ngắn:
PHP:
Function So_text(Chuoi As Range) As StringDim i As Long, so, chu
  For i = 1 To Len(Chuoi.Value) 
     so = Mid(Chuoi.Value, i, 1)  
     IF Not IsNumeric(so) Then    
         So_text = So_text & so  
     Else    
         So_text = So_text & Chr(so - 10 * (so = 0) + 96)  
     End If
  Next i
End Function
 
Lần chỉnh sửa cuối:
Rút gọn lại Code trên thành như vầy cho ngắn:
PHP:
Function So_text(Chuoi As Range) As StringDim i As Long, so, chu
  For i = 1 To Len(Chuoi.Value) 
     so = Mid(Chuoi.Value, i, 1)  
     IF Not IsNumeric(so) Then    
         So_text = So_text & so  
     Else    
         So_text = So_text & Chr(so - 10 * (so = 0) + 96)  
     End If
  Next i
End Function
Ngắn nữa nè:
Mã:
Function Doi(s As String) As StringDim X As Long
Doi = Replace(CStr(s), ".", "")
For X = 1 To Len(Doi)
    Mid(Doi, X) = Mid("jabcdefghi", Mid(Doi, X, 1) + 1, 1)
Next
End Function
 

File đính kèm

Ngắn nữa nè:
Mã:
Function Doi(s As String) As StringDim X As Long
Doi = Replace(CStr(s), ".", "")
For X = 1 To Len(Doi)
    Mid(Doi, X) = Mid("jabcdefghi", Mid(Doi, X, 1) + 1, 1)
Next
End Function

Cám ơn bạn đã đưa ra cách của bạn để mọi người cùng học hỏi thêm.
Tuy nhiên cách này của bạn hình như chỉ áp dụng với chuỗi chỉ chứa các số thôi, nếu có cả chữ cái xen lẫn nữa thì bị báo lỗi #Value
 
Lần chỉnh sửa cuối:
@Chủ thớt:
Như bài #6 đã nói, bạn không sai ở MID : MID$
Điểm bạn sai là lệnh Select Case. Biểu thức đi tiếp theo Select Case phải so sánh được với biểu thức đi sau mỗi Case

Mã:
Function so_text(chuoi As String) As String
Dim i, n As Byte
Dim so, so1, so2 As String
n = Len(chuoi)
so2 = ""
If n > 0 Then
For i = 1 To n
so1 = Mid(chuoi, i, 1)
Select Case so1 [COLOR=#ff0000]' so1 ở đây là string, kết quả biểu thức đi sau Select Case là string[/COLOR]
Case so1 = "1": so = "a" [COLOR=#ff0000]' trong điều kiện ở đây, biểu thức so1 = "1" cho ra kết quả là boolean[/COLOR]
Case so1 = "2": so = "b" [COLOR=#ff0000]' string không so được với boolean cho nên không có chỗ nào đáp ứng cả[/COLOR]
Case so1 = "3": so = "c"
Case so1 = "4": so = "d"
Case so1 = "5": so = "e"
Case so1 = "6": so = "f"
Case so1 = "7": so = "g"
Case so1 = "8": so = "h"
Case so1 = "9": so = "i"
Case so1 = "0": so = "j"
End Select
so2 = so2 + so
Next i
End If
so_text = so2
End Function

Để chỉnh lại, bạn có thể dùng cách bài #3, tức là đổi kiểu xét ở mỗi case thành string.
Hoặc muốn sửa nhanh hơn thì chỉ cần sửa
Select Case so1 ===> Select Case True

Tuy nhiên, code của bạn, và của bài #3 sẽ ra kết quả sai nếu có ký tự không phải là số.

@khuongvietphong:

Bài này chuyển đổi ký tự thành ký tự -> độ dài cố định. Cho nên dùng hàm Mid để dổi thay vì nối chuỗi là phương pháp hiệu quả nhất.
Khi bạn dùng biểu thức nối chuỗi, VBA phải bỏ chuỗi cũ đi và lập chuối mới. Khi dùng hàm Mid, VBA vẫn giữ chuõi cũ, và vào đúng vị trí ấy để sửa trị. Kết quả nhanh hơn nhiều.
Điểm này tôi đã nêu lên nhiều lần trong các bài về chuỗi của tôi. Nếu bạn có hứng thú về lập trình thì cách VBA sử lý chuỗi cũng là điều nên hiểu rõ.

Để tránh lỗi, code như thế này:
for i = 1 to len(s)
c = InStr("1234567890", Mid(s, i, 1))
If c then Mid(s, i, 1) = Chr(96+c) ' 96 = 07-1, 97 là trị ascii của ký tự a
next
KQ = s

Chú thích: bài #9 viết đúng đường lối rồi, nhưng không hiểu sao lại phải CStr cái tham số s đã được định kiểu trong hàm là string rồi.
Có lẽ do tôi chỉ biết nói lý thuyết, trong khi người viết code giàu kinh nghiệm thực tiễn nên viết như thế để tránh lỗi gì đó?
Và tại sao lại bỏ luôn mấy cái dấu chấm thì tôi hoàn toàn chịu thua: Doi("12.3") = "abc"
 
Chú thích: bài #9 viết đúng đường lối rồi, nhưng không hiểu sao lại phải CStr cái tham số s đã được định kiểu trong hàm là string rồi.
Có lẽ do tôi chỉ biết nói lý thuyết, trong khi người viết code giàu kinh nghiệm thực tiễn nên viết như thế để tránh lỗi gì đó?
Và tại sao lại bỏ luôn mấy cái dấu chấm thì tôi hoàn toàn chịu thua: Doi("12.3") = "abc"

à há , thì ra anh Vetmini cũng không hiểu , qua giờ em đọc hoài chả hiểu sao cắt cụt cái dấu chấm , vậy là cũng có người không hiểu giống mình , hi hi .
 
à há , thì ra anh Vetmini cũng không hiểu , qua giờ em đọc hoài chả hiểu sao cắt cụt cái dấu chấm , vậy là cũng có người không hiểu giống mình , hi hi .

Tôi đoán là bỏ dấu chấm đi để tránh bị crash ở chỗ này:
Mid(Doi, X) = Mid("jabcdefghi", Mid(Doi, X, 1) + 1, 1) ' toán tử + tự động ép kiểu string thành số nếu vế còn lại là số
ký tự . không thể ép thành số --> type mismatch

Nếu ai khác thì tôi cho là viết code cẩu thả, kiểu đến đâu hay đến đó.

Nhưng vì biết người viết code có kinh nghiệm thực tế hơn tôi nhiều nên tôi chịu nhận là mình nghĩ không ra. Có lẽ họ có cách nhét dấu chấm trở lại nhưng chưa muốn đưa ra.
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom