Giúp code Wrap text ô trộn (Merge cells) (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

hanhpptc

Thành viên tiêu biểu
Tham gia
16/5/08
Bài viết
459
Được thích
320
Đối với ô không trộn, khi thực hiện căn chỉnh độ cao tự động của dòng thì ta chọn Wrap text là được. Tuy nhiên, với ô có dữ liệu là ô trộn (Merge cells), thì không tự động căn chỉnh độ cao của dòng được, cho dù đã đã thực hiện chọn Wrap text. Xin các bạn hướng dẫn Code tự động căn chỉnh giúp mình với.
 
Đối với ô không trộn, khi thực hiện căn chỉnh độ cao tự động của dòng thì ta chọn Wrap text là được. Tuy nhiên, với ô có dữ liệu là ô trộn (Merge cells), thì không tự động căn chỉnh độ cao của dòng được, cho dù đã đã thực hiện chọn Wrap text. Xin các bạn hướng dẫn Code tự động căn chỉnh giúp mình với.

Chắc còn cách khác hay hơn, nhưng cứ xài tạm cái này


PHP:
Sub wrap()
Dim dl, i
Set dl = [a1:a10]
For i = 1 To dl.Rows.Count
  dl(i, 1).WrapText = True
Next
End Sub
 
Upvote 0
Upvote 0
Cám ơn quanghai1969. Ý mình là đối với ô đã merge cột, chứ ô thường thì mình làm được
um nếu không đúng thì coi như thêm tí kinh nghiệm, nhưng khi mình gởi code lên cũng đã test rôi, khi gặp cell nào trộn thì sẽ wrap lại. Cái chính là code mẫu để tham khảo vì bạn có file đâu mà xác định đúng sai

Hay là mình lấy file này để kiểm chứng nha rồi bàn tiếp
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
um nếu không đúng thì coi như thêm tí kinh nghiệm, nhưng khi mình gởi code lên cũng đã test rôi, khi gặp cell nào trộn thì sẽ wrap lại. Cái chính là code mẫu để tham khảo vì bạn có file đâu mà xác định đúng sai

Hay là mình lấy file này để kiểm chứng nha rồi bàn tiếp
Ý mình muốn là wrap text các ô trộn như trong ví dụ này
 

File đính kèm

Upvote 0
Mình test rồi, code vẫn wrap text được mà, mình ví dụ trong [a1:a10], nếu dữ liệu của bạn là vùng khác thì sửa code lại chứ
Chắc là bạn chưa hiểu ý mình cần. Đối với các ô đã trộn (như ví dụ từ cột A đến cột C, tương ứng dòng 1 đến 10), khi dữ liệu trong ô vượt quá giới hạn ô đã trộn thì thực hiện tự động canh chiều cao của dòng để Wrap text cho phù hợp
Bạn test trong file VD của mình thử xem, sau khi thực hiện nó có giống các ô bên dưới đâu
 
Lần chỉnh sửa cuối:
Upvote 0
Chắc là bạn chưa hiểu ý mình cần. Đối với các ô đã trộn (như ví dụ từ cột A đến cột C, tương ứng dòng 1 đến 10), khi dữ liệu trong ô vượt quá giới hạn ô đã trộn thì thực hiện tự động canh chiều cao của dòng để Wrap text cho phù hợp
Bạn test trong file VD của mình thử xem, sau khi thực hiện nó có giống các ô bên dưới đâu

Mình thấy được mà, kiểm tra lại xem
 

File đính kèm

Upvote 0
Chưa đực bạn à, khi bạn thay đổi chiều dài dữ liệu, thì dòng không từ động căn chỉnh sau khi thực hiện macro. Bạn thử đi

um mình hiểu ra vấn đề của bạn rồi, chưa làm cái này được. Merge cột thì khó ăn thiệt. Đợi xem có anh chi nào khác giúp không
 
Upvote 0
Mình cũng nghĩ ra được cách này, tuy hơi kỳ cục nhưng có thể chế biến xài tạm tạm chắc cũng được
PHP:
Sub wrap()
Application.ScreenUpdating = False
Dim dl, i
[a1:a20].Copy: [d1].PasteSpecial 3
Set dl = [a1:d20]
[d:d].ColumnWidth = [a:a].ColumnWidth + [b:b].ColumnWidth + [c:c].ColumnWidth + 1
  For i = 1 To dl.Rows.Count
    dl(i, 1).WrapText = True
      dl(i, 4).WrapText = True
        dl(i, 4).Rows.AutoFit
          dl(i, 1).RowHeight = dl(i, 4).RowHeight
  Next
[d:d].Clear
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chả lẽ không có dòng này thì RowHeight dl(i, 1) khác RowHeight của dl(i, 4) sao?

Có thể anh chưa biết nguyên nhân, vì em phải lợi dụng cái autofit phía trên để lấy chiều cao cho các dòng của cột A, vì nếu không set chiều cao của cột A thì sau khi xoá dữ liệu ở cột D thì dòng của cột A sẽ co lại
 
Lần chỉnh sửa cuối:
Upvote 0
Có thể anh chưa biết nguyên nhân, vì em phải lợi dụng cái autofit phía trên để lấy chiều cao cho cột A, vì nếu không set chiều cao của cột A thì sau khi xoá cột D thì cột A sẽ co lại
Đúng là tà đạo! Có ai mà nghĩ ra chuyện set chiều cao 1 dòng bằng chính chiều cao dòng đó!
 
Upvote 0
Bởi vậy em mới nói cách này hơi kỳ cục, nhưng vì bí quá nên em mới dùng cách tà đạo này. Nhưng cũng là 1 cách để gở rối.

Cám ơn quanghai1969! Tuy cách của bạn mượn cột phụ D để set chiều cao của dòng nhưng chạy được. Trước mắt mình áp dụng chiêu này đã trước khi có thuật toán hay hơn. Một lần nữa cám ow3n bạn.
Còn cách của ndu96081631 (thực của anhtuan1966) chỉ áp dụng cho việc gõ trực tiếp (Target), mình không dùng được trong trường hợp này.
 
Upvote 0
Có thể đếm số ký tự tối đa trên 1 dòng, sau đó chia chiều dài chuỗi cho số đó, làm tròn lên (roundup), xong rồi ...
 
Upvote 0
Cám ơn quanghai1969! Tuy cách của bạn mượn cột phụ D để set chiều cao của dòng nhưng chạy được. Trước mắt mình áp dụng chiêu này đã trước khi có thuật toán hay hơn. Một lần nữa cám ow3n bạn.
Theo gợi ý của anh PTM mình thử code thế này, bạn xem coi thế nào. Mình code cho font chữ 12, nếu bạn sử dụng font size khác thì sửa lại số 0.13 cho phù hợp

PHP:
Sub wrap()
Application.ScreenUpdating = False
Dim dl, i, n, size
Set dl = [a1:a20]
n = [a:a].ColumnWidth + [b:b].ColumnWidth + [c:c].ColumnWidth
  For i = 1 To dl.Rows.Count
    size = dl(i, 1).Font.size
    dl(i, 1).WrapText = True
    dl(i, 1).RowHeight = Len(dl(i, 1)) / Round(n) * size * 0.13 * size
  Next
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Theo gợi ý của anh PTM mình thử code thế này, bạn xem coi thế nào. Mình code cho font chữ 12, nếu bạn sử dụng font size khác thì sửa lại số 0.13 cho phù hợp

PHP:
Sub wrap()
Application.ScreenUpdating = False
Dim dl, i, n, size
Set dl = [a1:a20]
n = [a:a].ColumnWidth + [b:b].ColumnWidth + [c:c].ColumnWidth
  For i = 1 To dl.Rows.Count
    size = dl(i, 1).Font.size
    dl(i, 1).WrapText = True
    dl(i, 1).RowHeight = Len(dl(i, 1)) / Round(n) * size * 0.13 * size
  Next
Application.ScreenUpdating = True
End Sub
Vì AutoFit không có tác dụng với Merge Cell nên giải thuật sẽ thế này
- Đầu tiên tính chiều rộng của Merge Cell (tạm gọi là curWidth)
- Xong, hủy Merge Cell để dữ liệu nằm trong 1 cell duy nhất
- Chỉnh chiều rộng của cell chứa dữ liệu đúng bằng với curWidth
- AutoFit cell này đồng thời lấy chiều cao mới (tạm gọi là lastHeight)
- Cuối cùng, Merge Cell trở lại và chỉnh chiều rộng = curWidth, chiều cao = lastHeight
- Set Wrap Text cho cell vừa Merge
------------------
Đại khái thế! Làm thử xem
 
Upvote 0
Mình làm được bằng VBA rồi, cách làm giống tương tự của pro ndu96081631
-Copy dữ liệu ra ô tạm khác (chọn ô ko liên quan, VD cell(1000,1000))
-Gán columwidth ô Merge gán vào ô tạm, wraptext ô tạm, sau đó lấy rowheight ô tạm. Gán rowheight ô tạm vào ô Merge rồi xóa cột tạm đó (để không ảnh hưởng khi in) là xong.
-Nhớ chỉnh Cell Style giống như font hiện hành sẽ không bị lỗi.
File bên dưới mình làm được rồi. Thanks!
 

File đính kèm

Upvote 0
File bên dưới mình làm được rồi. Thanks!

Mình làm được bằng VBA rồi, cách làm giống tương tự của pro ndu96081631
-Copy dữ liệu ra ô tạm khác (chọn ô ko liên quan, VD cell(1000,1000))
-Gán columwidth ô Merge gán vào ô tạm, wraptext ô tạm, sau đó lấy rowheight ô tạm. Gán rowheight ô tạm vào ô Merge rồi xóa cột tạm đó (để không ảnh hưởng khi in) là xong.
-Nhớ chỉnh Cell Style giống như font hiện hành sẽ không bị lỗi.
File bên dưới mình làm được rồi. Thanks!
Anh/chị vui lòng giải thích giúp em khi em gán thêm vùng dữ liệu, tại RangeData = Range("A8", "G8") khi tính độ rộng gán sang Range("L2") đúng với số cột trong vùng, nhưng với độ rộng của cả vùng thì RangeData tại vị trí này đúng ra không cần wraptext nhưng khi gán trở lại RangeData thì bị lỗi do Range("L2") Wraptext, em có gửi lại flie anh chị vui lòng xem giúp em vì như thế tại vị trí của RangeData = Range("A8", "G8") nhìn sẽ rất xấu, mặc dù dữ liệu thực tế có thể hên xui đúng theo dữ liệu giả định
Em xin cám ơn
 

File đính kèm

Upvote 0

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

Back
Top Bottom