Align với khoảng trắng (space)

Liên hệ QC

thanhma

Thành viên mới
Tham gia
4/3/09
Bài viết
6
Được thích
0
Mình có một bài toán như thế này.

Giả sử 1 cell align center có nội dung như sau: "nnnn/tháng"

Mình có 1 macro để replace ký tự theo color code thành khoảng trắng " ". Lần 1 remove chữ màu đỏ. Lần 2 remove chữ màu đen. Sau mỗi lần, file excel được đọc bởi 1 chương trình OCR tao ra file bmp.

Cái mình cần là sau khi chạy xong 2 lần thì ra đc 2 file ảnh bmp có thể merge lại với nhau thì y hệt như file Excel.

Khi replace phần chữ màu đỏ thì không sao. Vấn đề gặp phải là khi replace phần chữ màu đen như trong ví dụ, nội dung cell sẽ thành "nnnn " (6 space) và phần "nnnn" được align center. Dẫn đến khi ghép file ảnh lại bị đè lên nhau.

Có ai biết làm thế nào để giữ được align như cũ khi các ký tự đằng sau chuyển thành space thì giúp mình với.

Cảm ơn nhiều
 
Bạn thử làm bên phải trước xem sao. Tôi chỉ mới thoáng nghĩ, chưa biết có đúng không.
 
" /tháng" thì ok rồi, align được giữ nguyên
nhưng "nnnn " thì bị căn giữa cho 4 chữ n chứ ko phải cho 10 chữ

Ah quên, chính xác thì 2 lần replace độc lập với nhau, tức là lần đầu ra " /tháng", save as ra 1 file, rồi đọc lại file gốc, chạy tiếp lần 2 ra "nnnn " và save as ra file khác
 
Lần chỉnh sửa cuối:
Vậy bạn thử sửa code sao cho chạy lần 1 ra Rept(Char(32), 4) & " /tháng" và lần 2 ra kết quả "nnnn " & Rept(Char(32), 6)

Dù vậy, kết quả cũng chưa chắc như ý vì độ rộng ký tự trống và các ký tự khác như i, o, w là khác nhau.
 
Bạn dùng Font Courier cho vùng đó sẽ có kết quả khả quan vì Font Courier có độ rông tất cả các ký tự bằng nhau
Bạn xem file ví dụ, ô B4 và B5 canh dều nhau (B4="2332"&"DD" và B5=Space(4)&"DD")
 

File đính kèm

  • Book12.xls
    16 KB · Đọc: 15
Lần chỉnh sửa cuối:
Font chữ mình dùng là monospaced font rồi, khoảng trống giữa dấu cách và các ký tự khác là như nhau :)

Hiện tại code mình như thế này
Mã:
For Each cel In myDoc.UsedRange
        For i = 1 To Len(cel.Value)
            If cel.Characters(i, 1).Font.ColorIndex = Int(color) Then
                cel.Characters(i, 1).Text = " "

            End If
        Next
    Next
Mình có thử thay " " bằng Chr(32) nhưng không có gì thay đổi

Có 1 lần mình sửa bằng tay, ko nhớ là thay kiểu gì mà nó lại nhận được :=\+
 
Mình không có cái font của bạn nên không Test được. Trước đây mình đã đọc trên Vivosoft thì họ khẳng định chỉ có Courier mới có độ rộng ký tự bằng nhau mà thôi. Còn việc nhận ký tự thì chắc là đương nhiên chứ.

Minh đã Test bạn dùng Space() hoàn toàn OK
 
Lần chỉnh sửa cuối:
Hi bạn
Ngoài Courier ra thì còn 1 số font nữa thuộc họ monospace cũng có độ rộng của các ký tự bằng nhau, vd: Lucida Console

Mình thử sử dụng Space()
Mã:
 cel.Characters(i, 1).Text = Space(1)
nhưng vẫn bị căn vào giữa

Có vẻ dùng cách nối String & thì được, để mai mình thử lai xem sao
 
Cái Space() hình như nó có ảnh hưởng tới phương thức Characters hoặc Autocorect của Excel thì phải.
Mình có 2 đoạn Code, 1 Align được và 1 không Align được. Các bạn so sánh ô A2 và A3

Mã:
'Doan nay Align duoc
Sub test()
Dim i
   For i = 1 To Len(Sheet1.[a3])
       If Sheet1.[a3].Characters(i, 1).Font.ColorIndex = 3 Then
         Sheet1.[a3].Characters(i, 1).Text = "@"
            End If
        Next
  Sheet1.[a3] = Replace(Sheet1.[a3], "@", " ")
End Sub
'--------------------------------------------------------------
'Doan nay khong Align duoc
Sub test2()
Dim i
   For i = 1 To Len(Sheet1.[a3])
       If Sheet1.[a3].Characters(i, 1).Font.ColorIndex = 3 Then
         Sheet1.[a3].Characters(i, 1).Text = " "
            End If
        Next
End Sub
 

File đính kèm

  • Align.xls
    31 KB · Đọc: 18
Lần chỉnh sửa cuối:
Theo cách của bài #4 cho ra kết quả là công thức trên sheet
= "nnnn " & Rept(Char(32), 6)

thì code là:
PHP:
Sub Test3()
Dim i, j, tmp, Zin
    Zin = Sheet1.[a3]
   For i = 1 To Len(Sheet1.[a3])
       If Sheet1.[a3].Characters(i, 1).Font.ColorIndex = 3 Then
        j = j + 1
        tmp = tmp & Sheet1.[a3].Characters(i, 1).Text
        End If
        Next
    Sheet1.[a3] = "=" & """" & Replace(Zin, tmp, "") & """" & "&rept(Char(32)," & j & ")"

End Sub

Đã test thử trên file của Sealand.
 
Anh Ptm 0412 à, Sealand vẫn thắc mắc là hình như cái chuyện AutoCorect của Exc nó gây ra rắc rối ở đây thì phải. Nếu dạng số thì nó tự động cắt các số 0 đầu và Text thì cắt các khoảng trắng cuối thì phải. Ví dụ code sau

Mã:
Sub test2()
Dim i
   For i = 1 To Len(Sheet1.[a3])
       If Sheet1.[a3].Characters(i, 1).Font.ColorIndex = 3 Then
         Sheet1.[a3].Characters(i, 1).Text = " "
            End If
        Next
End Sub
Code này sẽ bị cắt hết khoảng trắng cuối.
Nếu thay

For i = 1 To Len(Sheet1.[a3]) thành For i = 1 To Len(Sheet1.[a3])-1
(Để lại Ký tự cuối) thì vẫn bình thường
 
Cái Space() hình như nó có ảnh hưởng tới phương thức Characters hoặc Autocorect của Excel thì phải.
Mình có 2 đoạn Code, 1 Align được và 1 không Align được. Các bạn so sánh ô A2 và A3

Mã:
'Doan nay Align duoc
Sub test()
Dim i
For i = 1 To Len(Sheet1.[a3])
If Sheet1.[a3].Characters(i, 1).Font.ColorIndex = 3 Then
Sheet1.[a3].Characters(i, 1).Text = "@"
End If
Next
Sheet1.[a3] = Replace(Sheet1.[a3], "@", " ")
End Sub
'--------------------------------------------------------------
'Doan nay khong Align duoc
Sub test2()
Dim i
For i = 1 To Len(Sheet1.[a3])
If Sheet1.[a3].Characters(i, 1).Font.ColorIndex = 3 Then
Sheet1.[a3].Characters(i, 1).Text = " "
End If
Next
End Sub
Nếu chuỗi ký tự Space ở cuối chuỗi được định dạng màu đen thì cell sẽ được Aglin bình thường, còn nếu chuỗi ký tự Space ở cuối chuỗi được định dạng màu khác thì cell chỉnh định dạng Aglin cho chuỗi ký tự trước đó (bỏ chuỗi ký tự Space).
Mượn file của Sealand, sửa sub Test2() lại như thế này thì được:
Mã:
Sub Test2()
Dim i As Long
    For i = 1 To Len(Sheet1.[a3])
        If Sheet1.[a3].Characters(i, 1).Font.ColorIndex = 3 Then
            Sheet1.[a3].Characters(i, 1).Font.ColorIndex = -4105
            Sheet1.[a3].Characters(i, 1).Text = " "
        End If
    Next
End Sub
 
Anh Ptm 0412 à, Sealand vẫn thắc mắc là hình như cái chuyện AutoCorect của Exc nó gây ra rắc rối ở đây thì phải. Nếu dạng số thì nó tự động cắt các số 0 đầu và Text thì cắt các khoảng trắng cuối thì phải. Ví dụ code sau
. . .
(Để lại Ký tự cuối) thì vẫn bình thường

Có lẽ đúng là nguyên nhân mà huuthangbd nêu. Ký tự trống mà định dạng màu sẽ bị ....
 
Thanks 2 bạn

Hiện tại thì đã có thể replace được theo hướng của hàm test() của sealand, tuy sau khi replace thì sẽ mất color của những chữ còn lại...

Các bạn cho mình hỏi thêm là trong Excel VBA có thể check được số byte của 1 ký tự không? Vì văn bản của mình là tiếng Nhật, có 2 kiểu là half-size (1 byte) và full-size (2 bytes). Half-size thì độ rộng bằng 1 nửa full-size. Trong cùng 1 dòng mà có cả full-size và half-size thì sẽ bị lệch.

Nếu check được số byte của ký tự thì có thể replace được cho từng trường hợp, " " cho half-size và " " cho full-size (các bạn để ý khoảng trắng thứ 2 rộng hơn khoảng trắng thứ nhất)

Cảm ơn nhiều
 
Thanks 2 bạn

Hiện tại thì đã có thể replace được theo hướng của hàm test() của sealand, tuy sau khi replace thì sẽ mất color của những chữ còn lại...

Các bạn cho mình hỏi thêm là trong Excel VBA có thể check được số byte của 1 ký tự không? Vì văn bản của mình là tiếng Nhật, có 2 kiểu là half-size (1 byte) và full-size (2 bytes). Half-size thì độ rộng bằng 1 nửa full-size. Trong cùng 1 dòng mà có cả full-size và half-size thì sẽ bị lệch.

Nếu check được số byte của ký tự thì có thể replace được cho từng trường hợp, " " cho half-size và " " cho full-size (các bạn để ý khoảng trắng thứ 2 rộng hơn khoảng trắng thứ nhất)

Cảm ơn nhiều
Nếu bạn dùng hàm Test() của Sealand thì chú ý chọn ký tự trung gian cho phù hợp. Nếu trong chuỗi ký tư của bạn có xuất hiện ký tự giống như ký tự trung gian thì kết quả sẽ không như mong đợi của bạn.
 
Nếu chuỗi ký tự Space ở cuối chuỗi được định dạng màu đen thì cell sẽ được Aglin bình thường, còn nếu chuỗi ký tự Space ở cuối chuỗi được định dạng màu khác thì cell chỉnh định dạng Aglin cho chuỗi ký tự trước đó (bỏ chuỗi ký tự Space).
Mượn file của Sealand, sửa sub Test2() lại như thế này thì được:
Mã:
Sub Test2()
Dim i As Long
    For i = 1 To Len(Sheet1.[a3])
        If Sheet1.[a3].Characters(i, 1).Font.ColorIndex = 3 Then
            Sheet1.[a3].Characters(i, 1).Font.ColorIndex = -4105
            Sheet1.[a3].Characters(i, 1).Text = " "
        End If
    Next
End Sub
Trong ví dụ của mình thì chuỗi tận cùng đang để màu đen (automatic), khi replace bởi " " thì phần space ko được tính align mà
 
Trong ví dụ của mình thì chuỗi tận cùng đang để màu đen (automatic), khi replace bởi " " thì phần space ko được tính align mà
Vậy thì sửa lại một chút. Nếu chuỗi ký tự trong cell định dạng màu không đồng nhất thì khi align các ký tự space cuối chuỗi sẽ không được tính.
 
Web KT

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

Back
Top Bottom