Hàm vlookup dò giá trị khác font.

  • Thread starter Thread starter caocat
  • Ngày gửi Ngày gửi
Liên hệ QC
Cám ơn bác, giờ em mới biết các kí tự thường dùng có mã code từ 33 đến 126. Qua đó sửa lại code của bài #10 như này cho chuẩn, không cần bảng dò luôn :p

PHP:
Sub convert2()
Dim i As Long
For i = 33 To 126
    Selection.Replace What:=ChrW(i + 65248), Replacement:=ChrW(i), SearchOrder:=xlByRows
Next
End Sub
Những ký tự nhìn thấy - ký tự văn bản có điểm mã từ 33 tới 126 (hex từ &H21 tới &H7E) mà hàng ngày ta gõ vd. trong Excel thuộc Unicode Block “Basic Latin” (xem https://www.compart.com/en/unicode/block/U+0000).

View attachment 251432

Các ký tự nhìn bằng mắt thấy có vẻ giống như các ký tự kể trên chúng có điểm mã từ &FF01 tới &HFF5E, và thuộc Unicode Block “Halfwidth and Fullwidth Forms” (xem https://www.compart.com/en/unicode/block/U+FF00).

View attachment 251433

Nếu các ký tự ở vùng 1 có tên vd. là Hichic thì ký tự nhìn có vẻ giống như thế nhưng ở vùng 2 sẽ có tên là Fullwidth Hichic. Vd. "A" hàng ngày ta gõ trên bàn phím có tên là LATIN CAPITAL LETTER A, còn "A" nhái kia có tên là FULLWIDTH LATIN CAPITAL LETTER A.

Từ đâu có 65248? Dễ thấy 65248 = &HFEE0.
Nhìn hình 1 ta thấy "A" có điểm mã là &H41 (hex), còn nhìn hình 2 thấy "A" nhái có điểm mã là &HFF21. 2 ký tự này có điểm mã cách nhau đúng &HFEE0 (65248) - &H41 + &HFEE0= &HFF21
----------
Code convert trong bài #10 chưa chuẩn. Cụ thể vd. kết quả cho B177 là "SI-E2軸筒(更新型)" (trước ( và sau ) nhìn thấy "dãn cách") trong khi phải là "SI-E2軸筒(更新型)", hoặc kết quả cho B161 là "STM-EC/T" trong khi phải là "STM-EC/T".

Tôi đề nghị như sau, không dám khẳng định là chuẩn nhưng ai thích thì thử.
Mã:
Sub convert()
Dim k As Long, r As Long, c As Long, code As Long, s As String, text As String, mot_o As Boolean, vung As Range, o_dau As Range, dulieu()
    On Error Resume Next
    Set vung = Application.InputBox("Hay chon vung du lieu can bien doi", Type:=8)
    If vung Is Nothing Then Exit Sub
    Set o_dau = Application.InputBox("Hay chon o dau tien cho ket qua", Type:=8)
    If o_dau Is Nothing Then Exit Sub
    On Error GoTo 0
    If vung.Count = 1 Then mot_o = True
    If mot_o Then
        dulieu = vung.Resize(2).Value
    Else
        dulieu = vung.Value
    End If
    Set o_dau = o_dau(1)
    For r = 1 To UBound(dulieu, 1) + mot_o
        For c = 1 To UBound(dulieu, 2)
            text = ""
            s = dulieu(r, c)
            For k = 1 To Len(s)
                code = AscW(Mid(s, k, 1))
                If code > &HFF00 And code < &HFF5F Then
                    text = text & Chr(code + 288)
                Else
                    text = text & ChrW(code)
                End If
            Next k
            dulieu(r, c) = text
        Next c
    Next r
    o_dau.Resize(UBound(dulieu, 1) + mot_o, UBound(dulieu, 2)).Value = dulieu
End Sub
Cám ơn 2 bác đã chia sẻ. Chúc 2 bác nhiều sức khoẻ.
 
Web KT

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

Back
Top Bottom