Các Row sẽ có cùng độ cao (do ta ấn định) nếu chúng cùng số dòng chữ trong Cell (1 người xem)

Liên hệ QC

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

nguyenmanhnam

Thành viên tiêu biểu
Tham gia
24/7/10
Bài viết
434
Được thích
266
Em hay gặp trường hợp nếu Ceel của 1 dòng (mặc dù để chế độ Wrap text nhưng in ra số dòng vẫn không thể hiện hết được chữ mặc dù em không hề Merge Cell); khi em làm thầu Bảng đơn giá chi tiết rất dài có khi hàng chục ngàn dòng, nếu căn độ cao dòng để in ra thì rất mất thời gian. Do vậy, em xin phép được hỏi mọi người tư vấn cho em 1 trong 2 giải pháp:

Giải pháp 1:
- Những Row nào mà Cell có số dòng chữ (có số dòng lớn nhất trong các Cell thuộc Row đó) là 1 thì chiều cao của cả dòng đó là 18 chẳng hạn;
- Những Row nào mà Cell có số dòng chữ (có số dòng lớn nhất trong các Cell thuộc Row đó) là 2 thì chiều cao của cả dòng đó là 36 chẳng hạn;
- Những Row nào mà Cell có số dòng chữ (có số dòng lớn nhất trong các Cell thuộc Row đó) là 3 thì chiều cao của cả dòng đó là 48 chẳng hạn;
....(các thông số 18,36,48 do ta tự ấn định).

Giải pháp 2: Em dùng chế độ Autofix sau đó làm cách nào mà tất cả các dòng hiện hành có độ cao của dòng được nhân với hệ số 1,1 chẳng hạn.
 
Em hay gặp trường hợp nếu Ceel của 1 dòng (mặc dù để chế độ Wrap text nhưng in ra số dòng vẫn không thể hiện hết được chữ mặc dù em không hề Merge Cell); khi em làm thầu Bảng đơn giá chi tiết rất dài có khi hàng chục ngàn dòng, nếu căn độ cao dòng để in ra thì rất mất thời gian. Do vậy, em xin phép được hỏi mọi người tư vấn cho em 1 trong 2 giải pháp:

Giải pháp 1:
- Những Row nào mà Cell có số dòng chữ (có số dòng lớn nhất trong các Cell thuộc Row đó) là 1 thì chiều cao của cả dòng đó là 18 chẳng hạn;
- Những Row nào mà Cell có số dòng chữ (có số dòng lớn nhất trong các Cell thuộc Row đó) là 2 thì chiều cao của cả dòng đó là 36 chẳng hạn;
- Những Row nào mà Cell có số dòng chữ (có số dòng lớn nhất trong các Cell thuộc Row đó) là 3 thì chiều cao của cả dòng đó là 48 chẳng hạn;
....(các thông số 18,36,48 do ta tự ấn định).

Giải pháp 2: Em dùng chế độ Autofix sau đó làm cách nào mà tất cả các dòng hiện hành có độ cao của dòng được nhân với hệ số 1,1 chẳng hạn.
Vấn đề quan trọng: Không có cách nào để biết được cell hiện đang chưa bao nhiêu dòng, ngoại trừ trường hợp bạn chủ động xuống dòng bằng phím Alt + Enter
 
Mục đích của em là khi in ra chiều rộng của dòng chứa hết được chữ (chữ in ra nhìn thấy hết). Do vậy số dòng trong bài toán của em được xác định bằng số dòng hiện trên màn hình khi ta kéo độ cao của dòng ra hết cỡ (tức là kể cả không ấn phím Atl mà khi đánh thêm chữ Ceel xuống dòng thì cũng coi như được tính thêm dòng)
 
Có thể dùng VBA ấn định chiều cao dòng dựa vào chiều dài chuỗi ký tự. Dĩ nhiên phải tính 1 cách tương đối có dự phòng.
 
Tức là cách làm phải theo hướng đếm số ký tự trong ô; chứ excel không thể hiểu được số dòng tự động tràn xuống (ví dụ khi không ấn Atl+Enter thì thực chất là 1 đoạn nhưng là 5 dòng) hả thày?
 
Có thể dùng VBA ấn định chiều cao dòng dựa vào chiều dài chuỗi ký tự. Dĩ nhiên phải tính 1 cách tương đối có dự phòng.
Thưa thày nếu cách 1 không khả thi, em nhờ cách thày xem giúp em cách thứ 2 của em khả thi không ah:

Bước 1: Ban đầu em dùng chế độ kích đúp vào đường lưới để sử dụng chế độ Autofit.

Bước 2: Nếu chế độ Autofit không hiện ra đủ độ cao cho các Cell có số dòng lớn thì em muốn xử lý như sau ah: Cả bảng tính của em độ cao các dòng được điều chỉnh mới = độ cao dòng hiện tại x hệ số(1,1 hoặc 1,2 gì đó...) chỉ bằng một động tác duy nhất.

Nếu em làm như vậy thì Code của em phải ra sao ah?
 
Tức là cách làm phải theo hướng đếm số ký tự trong ô; chứ excel không thể hiểu được số dòng tự động tràn xuống (ví dụ khi không ấn Atl+Enter thì thực chất là 1 đoạn nhưng là 5 dòng) hả thày?

Nghĩa là sau khi điều chỉnh độ rộng cột vừa với trang in, đếm số ký tự của 1 dòng trong cột đó (bắng tay hoặc bằng thủ thuật gì đó). Giả sử bằng 30, trừ hao các ký tự ngắn như i, dấu chấm, ... thì lấy 27

Sau đó dùng code:
- Duyệt từng dòng
- Lấy độ dài chuỗi ký tự của cell trong dòng đó, chia cho 27 (làm tròn lên)
- Lấy kết quả nhân với chiều cao chuẩn của 1 dòng, gán cho dòng đó.

Cách này bảo đảm đều nhất vì đã nhân với 1 tỷ lệ. Còn cách của bài #6 không bảo đảm lắm.
 
Nghĩa là sau khi điều chỉnh độ rộng cột vừa với trang in, đếm số ký tự của 1 dòng trong cột đó (bắng tay hoặc bằng thủ thuật gì đó). Giả sử bằng 30, trừ hao các ký tự ngắn như i, dấu chấm, ... thì lấy 27

Sau đó dùng code:
- Duyệt từng dòng
- Lấy độ dài chuỗi ký tự của cell trong dòng đó, chia cho 27 (làm tròn lên)
- Lấy kết quả nhân với chiều cao chuẩn của 1 dòng, gán cho dòng đó.

Cách này bảo đảm đều nhất vì đã nhân với 1 tỷ lệ. Còn cách của bài #6 không bảo đảm lắm.

Nhưng có thể xảy ra trường hợp em lấy ví dụ dòng 2: ô B2 có số ký tự 27 ký tự < số ký tự của ô C2 là 50 ký tự. Nhưng thực chất ô B2 cần nhiều dòng hơn (do độ rộng của cột B nhỏ hơn cột C nhiều), dĩ nhiên bảng sau khi căn chỉnh thì độ rộng cột là không thay đổi.

Do đó, liệu máy có khi nó lại hiểu dòng đó nó cần điều chỉnh độ cao xuất phát từ ô cần làm việc là ô C2 chứ không phải là B2?
 
Mình thấy các cách các bạn nêu ra cũng có thể chưa ổn với trường hợp cụ thể nào đó. Nếu giá trị trong ô là 1 dãy số hay ký tự liền nhau (Không có dấu cách) thì như ý kiến các bạn không có vấn đề. Nhưng giá trị trong ô là 1 đoạn văn bản thì việc Wrap Text đâu có như các bạn giả định. Khi không đủ chiều dài thì nó không phải mang xuống dòng dưới các ký tự thừa mà nó mang xuống các từ thừa.
 
Mình thấy các cách các bạn nêu ra cũng có thể chưa ổn với trường hợp cụ thể nào đó. Nếu giá trị trong ô là 1 dãy số hay ký tự liền nhau (Không có dấu cách) thì như ý kiến các bạn không có vấn đề. Nhưng giá trị trong ô là 1 đoạn văn bản thì việc Wrap Text đâu có như các bạn giả định. Khi không đủ chiều dài thì nó không phải mang xuống dòng dưới các ký tự thừa mà nó mang xuống các từ thừa.

Thực ra thì việc này xuất phát từ tình huống thực tế thôi bác ah, có những bảng tính lớn mặc dù không sử dụng hợp nhất các ô merge Cell, cả bảng đều để chế độ Wrap Text để nó tự điều chỉnh độ cao dòng nhưng không hiểu sao vẫn có những ô có số text lớn thì độ cao dòng không tự điều chỉnh để chứa được hết các Text trong ô nên em mới phải nghĩ đến tình huống này.
 
Nhưng có thể xảy ra trường hợp em lấy ví dụ dòng 2: ô B2 có số ký tự 27 ký tự < số ký tự của ô C2 là 50 ký tự. Nhưng thực chất ô B2 cần nhiều dòng hơn (do độ rộng của cột B nhỏ hơn cột C nhiều), dĩ nhiên bảng sau khi căn chỉnh thì độ rộng cột là không thay đổi.

Do đó, liệu máy có khi nó lại hiểu dòng đó nó cần điều chỉnh độ cao xuất phát từ ô cần làm việc là ô C2 chứ không phải là B2?
Té ra là có nhiều cột cần chỉnh. Bài trên tôi gợi ý là chỉ có 1 cột cần chỉnh.

Nếu có 2 cột cần chỉnh (A và B) thì sửa lại 1 chút:

Sau khi điều chỉnh độ rộng cột vừa với trang in, đếm số ký tự của 1 dòng trong cột A giả sử 30, cột B giả sử 20
(Đếm 1 dòng đầy ngay khi bị xuống dòng)

Sau đó dùng code:
- Duyệt từng dòng
- Lấy độ dài chuỗi ký tự của cell A dòng đó, chia cho 30 (làm tròn lên) cho kết quả tmp1,
- Lấy độ dài chuỗi ký tự của cell B dòng đó, chia cho 20 (làm tròn lên) cho kết quả tmp2,
- Lấy số lớn hơn giữa tmp1 và tmp2 (max)
- Lấy số lớn hơn đó, nhân với chiều cao chuẩn của 1 dòng, gán cho dòng đó.

Nếu 3 cột, tính 3 cái, và vẫn lấy max.
sealand đã viết:
Nhưng giá trị trong ô là 1 đoạn văn bản thì việc Wrap Text đâu có như các bạn giả định. Khi không đủ chiều dài thì nó không phải mang xuống dòng dưới các ký tự thừa mà nó mang xuống các từ thừa.
Sealand nói rất đúng, nên tôi đã nói rõ là chỉ tính 1 cách tương đối và có dự phòng. Nếu dự phòng cả cho 1 từ bị đưa xuống dòng dưới, thì nếu thấy sai sót, cộng trừ 1 số nào đó và thử lại đến khi tốt đẹp nhất thì thôi.
 
Té ra là có nhiều cột cần chỉnh. Bài trên tôi gợi ý là chỉ có 1 cột cần chỉnh.

Nếu có 2 cột cần chỉnh (A và B) thì sửa lại 1 chút:

Sau khi điều chỉnh độ rộng cột vừa với trang in, đếm số ký tự của 1 dòng trong cột A giả sử 30, cột B giả sử 20
(Đếm 1 dòng đầy ngay khi bị xuống dòng)

Sau đó dùng code:
- Duyệt từng dòng
- Lấy độ dài chuỗi ký tự của cell A dòng đó, chia cho 30 (làm tròn lên) cho kết quả tmp1,
- Lấy độ dài chuỗi ký tự của cell B dòng đó, chia cho 20 (làm tròn lên) cho kết quả tmp2,
- Lấy số lớn hơn giữa tmp1 và tmp2 (max)
- Lấy số lớn hơn đó, nhân với chiều cao chuẩn của 1 dòng, gán cho dòng đó.

Nếu 3 cột, tính 3 cái, và vẫn lấy max.

Sealand nói rất đúng, nên tôi đã nói rõ là chỉ tính 1 cách tương đối và có dự phòng. Nếu dự phòng cả cho 1 từ bị đưa xuống dòng dưới, thì nếu thấy sai sót, cộng trừ 1 số nào đó và thử lại đến khi tốt đẹp nhất thì thôi.

Vâng, chỉ cần làm được tương đối như thày chỉ thực sự là quá tuyệt vời rồi. Bời thày không biết thôi, nếu thày làm trong lĩnh vực dự thầu những dự án lớn nhóm A trong đó có nhiều gói thầu, bảng chi tiết dự thầu cần phải xử lý có khi hàng trăm ngàn dòng (1 bộ bảng biểu in ra cỡ khoảng 2.000 trang ý ah).

Em xin kính đề nghị thày giúp em cái vụ Code này với ah.
 
PHP:
Sub RwHeight()
Const StdRHeight = 13
Dim i As Long, tmp1 As Long, tmp2 As Long

For i = 10 To 2000
    tmp1 = Application.RoundUp(Len(Cells(i, 2)) / 27, 0)
    tmp2 = Application.RoundUp(Len(Cells(i, 3)) / 13, 0)
    Rows(i).RowHeight = Application.Max(tmp1, tmp2) * StdRHeight
Next
End Sub

StdRHeight (chiều cao 1 dòng chuẩn) hiện đang là 13, có thể sửa thành 16 chẳng hạn.
27 và 13 là tôi đếm giả định trên 1 file dữ liệu giả lập của 2 cột B và C
dữ liệu giả lập bắt đầu từ dòng 10 và kết thúc dòng 2000
Nếu hàng chục ngàn dòng thì kiếm ly cafe, hàng trăm ngàn dòng thì kiếm 1 thùng bia ngồi uống trong khi chờ.
 
Lần chỉnh sửa cuối:
Vâng, chỉ cần làm được tương đối như thày chỉ thực sự là quá tuyệt vời rồi. Bời thày không biết thôi, nếu thày làm trong lĩnh vực dự thầu những dự án lớn nhóm A trong đó có nhiều gói thầu, bảng chi tiết dự thầu cần phải xử lý có khi hàng trăm ngàn dòng (1 bộ bảng biểu in ra cỡ khoảng 2.000 trang ý ah).

Em xin kính đề nghị thày giúp em cái vụ Code này với ah.
Mình cũng thường gặp và làm dạng này. Mình thường không dùng VBA mà làm bằng tay như sau:
Chọn dòng hoặc cột hoặc khối ô cần Wrap text;
Định dạng ô Wrap text.
Bôi đen tất cả các dòng cần chỉnh, rà chuột vào dòng, khi chuột xuất hiện dâu "+" thì nhấp đúp.
Nếu dùng VBA, theo mình giải quyết theo hướng này sẽ rất nhanh.
 
Liệu có thể đếm được số ký tự tối đa trên 1 dòng của 1 cột đã xác định độ rộng không

Thưa thày Ptm0412, trong Code này
PHP:
Sub RwHeight()
Const StdRHeight = 13
Dim i As Long, tmp1 As Long, tmp2 As Long

For i = 10 To 2000
    tmp1 = Application.RoundUp(Len(Cells(i, 2)) / 27, 0)
    tmp2 = Application.RoundUp(Len(Cells(i, 3)) / 13, 0)
    Rows(i).RowHeight = Application.Max(tmp1, tmp2) * StdRHeight
Next
End Sub

27 và 13 là tôi đếm giả định trên 1 file dữ liệu giả lập của 2 cột B và C
Sau khi căn chỉnh độ rộng cột, căn chỉnh trang tin đẹp rồi thì việc đếm ở câu trên liệu có thực hiện bằng công thức (tự động) không thày, hay phải nhìn bằng thủ công?
 
Lần chỉnh sửa cuối:
Thưa thày Ptm0412, trong Code này
Sau khi căn chỉnh độ rộng cột, căn chỉnh trang tin đẹp rồi thì việc đếm ở câu trên liệu có thực hiện bằng công thức (tự động) không thày, hay phải nhìn bằng thủ công?
Phải làm thủ công thôi bạn à.
 
Em hay gặp trường hợp nếu Ceel của 1 dòng (mặc dù để chế độ Wrap text nhưng in ra số dòng vẫn không thể hiện hết được chữ mặc dù em không hề Merge Cell); khi em làm thầu Bảng đơn giá chi tiết rất dài có khi hàng chục ngàn dòng, nếu căn độ cao dòng để in ra thì rất mất thời gian. Do vậy, em xin phép được hỏi mọi người tư vấn cho em 1 trong 2 giải pháp:

Giải pháp 1:
- Những Row nào mà Cell có số dòng chữ (có số dòng lớn nhất trong các Cell thuộc Row đó) là 1 thì chiều cao của cả dòng đó là 18 chẳng hạn;
- Những Row nào mà Cell có số dòng chữ (có số dòng lớn nhất trong các Cell thuộc Row đó) là 2 thì chiều cao của cả dòng đó là 36 chẳng hạn;
- Những Row nào mà Cell có số dòng chữ (có số dòng lớn nhất trong các Cell thuộc Row đó) là 3 thì chiều cao của cả dòng đó là 48 chẳng hạn;
....(các thông số 18,36,48 do ta tự ấn định).

Giải pháp 2: Em dùng chế độ Autofix sau đó làm cách nào mà tất cả các dòng hiện hành có độ cao của dòng được nhân với hệ số 1,1 chẳng hạn.

Mình chuyên làm thầu đây. Vấn đề của bạn là nằm ở cột "Thành phần hao phí" trong sheet "chiết tính" đúng không? bạn đạnh dạng cột đó ở chế độ wraptext, sau đó chọn cả sheet rồi kích đúp chuột vào dòng bất kỳ(chính là autofit tđó thôi)
 

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

Back
Top Bottom