Liệu có thể đếm tự động số ký tự tối đa trên 1 dòng của 1 cột (độ rộng cột không đổi)

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

597335

Thành viên hoạt động
Tham gia
19/2/12
Bài viết
126
Được thích
29
Em thấy tại bài http://www.giaiphapexcel.com/forum/showthread.php?54830-Các-Row-sẽ-có-cùng-độ-cao-(do-ta-ấn-định)-nếu-chúng-cùng-số-dòng-chữ-trong-Cell/page2

Code của thày Ptm0412 rất hay, em rất muốn áp dụng trong thực tế, vấn đề em cần hỏi là:

Giả sử cột B có độ rộng đã xác định trước (không đổi) thì có cách nào đếm số ký tự tối đa mà 1 dòng của cột B đó có thể chứa được (nếu vượt quá số tối đa đó nó sẽ tự động xuống dòng)

Rất mong các thày giúp đỡ./.
 
Em thấy tại bài http://www.giaiphapexcel.com/forum/showthread.php?54830-Các-Row-sẽ-có-cùng-độ-cao-(do-ta-ấn-định)-nếu-chúng-cùng-số-dòng-chữ-trong-Cell/page2

Code của thày Ptm0412 rất hay, em rất muốn áp dụng trong thực tế, vấn đề em cần hỏi là:

Giả sử cột B có độ rộng đã xác định trước (không đổi) thì có cách nào đếm số ký tự tối đa mà 1 dòng của cột B đó có thể chứa được (nếu vượt quá số tối đa đó nó sẽ tự động xuống dòng)

Rất mong các thày giúp đỡ./.

Format Wrap text thì nó sẽ tự xuống dòng thôi, sao phải cần đến code?
Mà dám cá với bạn sẽ không có code nào tính toán chính xác cho vụ này đâu
 
Upvote 0
Chế độ Format Wrap sẽ không điều chỉnh độ cao của dòng để nhìn thấy hết các chữ nếu 1 cell trong dòng ấy có số ký tự lớn--> độ cao của dòng nhỏ hơn độ cao cần thiết để chứa hết các chữ (mặc dù không sử dụng chức năng Merge Cell),

Hơn nữa chế độ mặc định này nhiều khi dòng kẻ ôm sát với chữ quá --> nhìn khó.
Em giả định chế độ Wrap nếu trong ô có 1 dòng thì chiều cao mặc định là 13, 2 dòng là 26...Bây giờ em muốn điều chỉnh nếu 1 dòng là 16, hai dòng là 32 (tức là bội số của StdRHeight ở Code dưới).

Do mục đích dùng là căn chỉnh chiều cao dòng căn cứ vào Code của thày Ptm0412
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

tức là tại 2 dòng tmp1 và tmp2 thì có cách gì đếm tự động để ra số 27 và 13 không không?

Các số này (27,13) sẽ thay đổi tùy thuộc và độ rộng cột B và cột C
 
Lần chỉnh sửa cuối:
Upvote 0
Chế độ Format Wrap đôi khi không hiện ra đầy đủ độ cao của dòng nếu 1 cell trong dòng ấy có số ký tự lớn (mặc dù không sử dụng chức năng Merge Cell), hơn nữa chế độ mặc định này nhiều khi dòng kẻ ôm sát với chữ quá --> nhìn khó.
Em giả định chế độ Wrap nếu trong ô có 1 dòng thì chiều cao mặc định là 13, 2 dòng là 26...Bây giờ em muốn điều chỉnh nếu 1 dòng là 16, hai dòng là 32 (tức là bội số của StdRHeight ở Code dưới).

Do mục đích dùng là căn chỉnh chiều cao dòng căn cứ vào Code của thày Ptm0412
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

tức là tại 2 dòng tmp1 và tmp2 thì có cách gì đếm tự động để ra số 27 và 13 không không?

Các số này sẽ thay đổi tùy thuộc và độ rộng cột B và cột C
Bạn chỉ cần nhớ cho điều này: Sở trường của Excel là tính toán chứ không phải trang trí... Vậy nên cố gắng bắt nó làm cái sở đoản, chỉ tổ cực thân chứ không hiệu quả gì
Tôi đang nghĩ: Đã là Data Base thì có cần quan trọng mấy cái màu mè gì đó không? Vì có làm gì thì Value của nó cũng không vì thế mà thay đổi! Chỉ khi bạn xuất ra báo cáo, có tí màu mè cho bắt mắt thì tôi chấp nhận
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn thày Ndu rất nhiều, mục đích của em khi hỏi bài để có thể in ra trang trí báo cáo, đồng thời em cũng muốn tìm hiểu thêm 1 số thuật toán thày ah.
 
Upvote 0
Cám ơn thày Ndu rất nhiều, mục đích của em khi hỏi bài để có thể in ra trang trí báo cáo, đồng thời em cũng muốn tìm hiểu thêm 1 số thuật toán thày ah.

Nếu không có gì bất tiện, bạn hãy đưa file lên đây cho mọi người xem, biết đâu có thể gợi ý cho bạn 1 giải pháp khác
 
Upvote 0
Em xin gửi 1 file đơn giản nhất, tại ô E5 nếu sử dụng chức năng Format Wrap nó vẫn bị mất chữ thày ah?

Bài này em đưa ra ô E5 nó sử dụng Merge Cell, một số bài gốc em làm không sử dụng chức năng này nó cũng bị che chữ ah.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sở dĩ em muốn tìm tòi thuật toán là: Biết font chữ, cỡ chữ --> xác định chiều rộng của 1 ký tự (hay chính xác là độ rộng cần thiết để chứa 1 ký tự) --> số ký tự tối đa cần tìm = (Độ rộng cột/chiều rộng của 1 ký tự)

Nhưng em không biết cách tìm chiều rộng của 1 ký tự như thế nào cả?
 
Upvote 0
Em xin gửi 1 file đơn giản nhất, tại ô E5 nếu sử dụng chức năng Format Wrap nó vẫn bị mất chữ thày ah?

Bài này em đưa ra ô E5 nó sử dụng Merge Cell, một số bài gốc em làm không sử dụng chức năng này nó cũng bị che chữ ah.
Đó là vì bạn Merge Cells nên mới vậy!
Xem bài này thử có giúp ích gì không:
http://www.giaiphapexcel.com/forum/showthread.php?6773-Tự-động-điều-chỉnh-độ-cao-của-dòng
Nhớ thêm dòng On Error Resume Next để tránh lỗi
 
Upvote 0
Sở dĩ em muốn tìm tòi thuật toán là: Biết font chữ, cỡ chữ --> xác định chiều rộng của 1 ký tự (hay chính xác là độ rộng cần thiết để chứa 1 ký tự) --> số ký tự tối đa cần tìm = (Độ rộng cột/chiều rộng của 1 ký tự)

Nhưng em không biết cách tìm chiều rộng của 1 ký tự như thế nào cả?

"xác định chiều rộng của 1 ký tự"??? Bạn thử viết một loạt ký tự "i" rồi dòng khác một loạt ký tự "m" xem sao. Chắc chắn có nhiều "i" trong dòng hơn là "m". "chiều rộng" của các ký tự khác nhau. Do vậy 2 câu có cùng số ký tự thì có thể có chiều dài khác nhau.
Bạn có thể: chọn ký tự "rộng" nhất --> xác định với k nào thì chuỗi k ký tự đó vượt quá a (là chiiều rộng cho phép - chiều rộng cột?). Lúc đó chuỗi bất kỳ có (k - 1) ký tự sẽ có chiều rộng <= a.
"Nhưng em không biết cách tìm chiều rộng của 1 ký tự như thế nào cả"
Tôi e rằng Excel không giúp được gì vì nó được sinh ra để làm việc khác. Nhưng trong system thì đủ mọi "đồ nghề". System là môi trường để ta làm việc nên nó phải có "tất cả". Ai thích chơi Internet thì nó có "đồ" để chơi Internet, muốn chơi đồ họa, phim, nhạc, in, viết tài liệu, system có hết.
Tôi không biết liệu có ích cho bạn không nhưng bạn có thể tìm hiểu về các hàm GetTextExtentPoint32A/W, DrawTextA/W và lân cận. Nói ngắn gọn thì hàm thứ nhất trả về độ dài của Text đã cho (cần phải có cán của device context - mỗi device context có trong nó vd. Font được chọn), Text). Hàm thứ hai in Text trong device context được chọn - cần phải có cán của device context, Text, "hình chữ nhật" mà trong đó ta sẽ in Text, và options. Nhưng nếu option có chứa DT_CALCRECT thì không có in ấn gì mà sẽ được trả về chiều cao cần có của hình chữ nhật mà có chiều rộng cho trước sao cho toàn bộ Text nằm gọn trong hình chữ nhật. Vd. cũng một Text nhưng ta đặt chiều rộng là 100 rồi gọi hàm thì sẽ được trả về vd. chiều cao 200 nhưng nếu đặt chiều rộng là 120 rồi gọi hàm thì sẽ được trả về vd. chiều cao 150. Sau khi có được rectangle cần thiết rồi thì lại gọi hàm lần nữa nhưng không có option DT_CALCRECT thì Text sẽ được in trong rectangle đó. Tất cả các kiích thước được tính bằng PIXELS.
Về sử dụng hai hàm trên tôi soạn vd. trong Delphi rồi "dịch" sang VBA. Code không có bẫy lỗi, chưa được tối ưu. Nó chỉ để tham khảo cách dùng.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom