HÀM FITROW - Co giãn dòng tự động tối ưu nhất cho Excel v2.44 (*28/12/2024)

Liên hệ QC
***** CẬP NHẬT - v2.44 *****

Cập nhật 2.42 sửa một số lỗi trong mã và tăng tốc giãn dòng bằng cách giãn đồng thời các ô giá trị cùng cột
Và thêm các hàm bổ trợ giãn dòng cho Bảng để tiết kiệm hơn trong quá trình giãn dòng, với hàm bổ trợ fit_Tables()

Dự kiến bản cập nhật tiếp theo
Thêm hàm chức năng bổ trợ giãn dòng trước khi in.​
-------------------------------------------------------------------

Hôm nay tôi lại chia sẻ cho các bạn một Hàm VBA UDF có chức năng tự động co giãn dòng khi giá trị trong bảng tính thay đổi, thì quá trình co giãn dòng cũng tự động thay đổi theo.

Tôi quyết định viết code này bỡi vì trên diễn đàn có nhiều bài viết hỏi về co giãn dòng tự động, và khi tôi đọc qua các bài viết đó thì không thấy ai có thể xử lý vấn đề triệt để, hoặc là code chưa tối ưu, hoặc code chưa xử lý được nhiều vùng đã gộp cùng dòng.

Và hàm UDF là một cách tối ưu nhất giúp các bạn không phải code lại, mà chỉ cần viết Hàm như một hàm Excel bình thường để thực hiện tác vụ co giãn dòng.



HÀM FITROW - TỰ ĐỘNG GIÃN DÒNG

Chức năng của hàm:
  1. Co giãn dòng hoàn toàn tự động.
  2. Co giãn dòng kể cả các ô đã được gộp.
  3. Co giãn dòng với các giá trị nhiều ô gộp cùng dòng.
  4. Co giãn dòng kể cả chiều cao vượt giới hạn của Excel là 409.5
  5. Hoạt động cả ở chế độ Xem In Ấn.
    • Thêm chiều cao nhất định cho dòng đã giãn.
    • Đặt chiều cao mặc định cho vùng trống.
    • Đặt chiều cao mặc định cho dòng trống.
    • Tự đặt tỉ lệ giãn chiều rộng, chiều cao và thụt đầu dòng, khi chiều cao dòng vượt giới hạn.
  6. Vì dùng hàm UDF nên rất tối ưu, tiết kiệm CPU.
  7. Chỉ cần gõ một biểu thức FITROW cho cả vùng cần co giãn.
  8. Tự động dịch chuyển lề trên hoặc lề dưới của trang để chỉ mục nằm vị trí tốt nhất để in ấn.
Các cập nhật thêm
  1. Đã tạo Add-in cho hàm giãn dòng, thêm phím tắt giãn dòng CTRL+SHIFT+ALT+R.
  2. Thay đổi giải thuật giãn dòng chính xác hơn.
  3. Cách viết hàm khác hoàn toàn so với trước, đối số nhập vào phải là một hàm.
  4. Giãn dòng kể cả ô vượt giới hạn 409.5 đơn vị chiều cao ô Excel.
  5. Giãn dòng biên bản tự động dịch chuyển và canh trang để chỉ mục không bị trồi lên hoặc thụt xuống trang khác.
  6. Chỉ cần gõ 1 biểu thức FITROW duy nhất cho cả vùng ô cần giãn dòng.
  7. Có hai phiên bản ứng dụng của hàm FITROW:
  • Mã viết trong 1 module duy nhất (tốn kém bộ nhớ khi ứng dụng hoạt động).
  • Sử dụng mã trong Classes (tiết kiệm bộ nhớ).

Hướng dẫn sử dụng hàm:

Hàm FITROW có 2 chế độ, là tạo nút nhấn để dùng tay và tự động chạy.
Nếu nhập hàm mà có nhập thêm bổ trợ fit_Auto() thì hàm nhập tự động chạy, khi giá trị tham chiếu thay đổi.
Nếu không sẽ tạo nút nhấn, để nhấn giãn dòng.


Hàm FITROW được viết theo phương pháp mới nên cách nhập đối số là gõ hàm như dưới đây:

Hàm cài đặt và bổ trợKiểuChức năng
fit_Padding(Height)SốTăng chiều cao thêm một số
fit_defaultHeight(Height)SốChiều cao mặc định nếu giá trị rỗng, dễ hiểu, nếu co giãn vùng ô A1:C20, mà cả vùng đó rỗng, thì chỉnh về chiều cao mặc định.
fit_HeightOfRowNull(Height)SốĐặt chiều cao mặc định cho cả dòng rỗng (giãn vùng A1:Z20, dòng A2:Z2 rỗng)
fit_AllSheets()Giãn dòng kể cả vùng ở trang tính không hiện hành.
fit_Auto()Bật tự động Fit khi ô tham chiếu thay đổi giá trị
Vì hàm FITROW có thể chạy bất kỳ khi nào gây tốn kém, mất thời gian khi các hàm nhạy như ToDay, Now, Rand, RandBetween, ... nằm cùng trang tính. Nên cần hàm bổ trợ này.
fit_Tables(table, ....)Vùng ôNhập một vùng dữ liệu kiểu bảng để tiết kiệm thời gian giãn dòng
fit_Indexes(cell1,cell2,...)Vùng chứa nhóm văn bảnCăn chỉnh biên bản ở chế độ PrintView, khi giãn dòng, chiều cao trang in có thể cao hơn hoặc thấp hơn, làm cho trang in bị xê dịch, nên cần điều chỉnh để phù hợp.
fit_Scale(scaleWidth,scaleHeight,indentWidth)Đặt tỉ lệ giãn chiều rộng, chiều cao và thụt đầu dòng, khi chiều cao dòng vượt giới hạnVì khi giãn dòng, sẽ có sai số độ lệch nhất định nên cần đặt thông số này.
Thông số tỉ lệ chiều rộng và cao quyết định độ chính xác khi giãn dòng.
Cho ô chiều cao vượt giới hạn. Và ô gộp có nhiều cột.
Ví dụ:
Đặt ScaleWidth = 0.0245 hiểu là tăng độ rộng ban đầu 1 * 0.0245 để thực hiện fit.
Đặt ScaleHeight = 0.0145 hiểu là tăng thêm chiều cao sau khi fit là 1 * 0.0145 để đặt cho dòng.

Viết hàm nhanh: =FITROW(A2:F1000)
Viết hàm có cài đặt đối số: =FITROW(A2:F1000,fit_defaultHeight(40),fit_Padding(5))
Cách nhập nhiều vùng cần co giãn dòng:
=FITROW(A1:C9,D2:F3,E5:E6)
Ví dụ: giãn dòng A1 và đối số, gõ =FITROW(A1,fit_Padding(5))
Các hàm với các ký tự đầu là fit_... Chính là các hàm cài đặt và bổ trợ cho hàm chính FITROW
Ví dụ: gõ =FITROW(A1,B4,C5), sẽ co giãn các ô A1, B4, C5, các cài đặt là mặc định


Hàm bỗ trợ fit_Indexes cho hàm FitRow hoạt động như sau:

Hãy xem ảnh minh họa 1 bên dưới, các bạn sẽ thấy lề dưới canh trang mục 4.2 có vùng bảng dữ liệu được tự động chuyển xuống trang mới, lúc này in ra sẽ hoàn hảo. Nhưng nếu mục 4.2 bị dịch lên trên trang trên như hình ảnh thứ 2 thì làm cho trang in khó đọc và không tích hợp để xem.​
Chính vì vậy sự bổ trợ của fit_Indexes sẽ giúp khắc phục điều này, mã sẽ chạy để dịch chuyển vùng đã đặt lên xuống sao cho trang in phù hợp.

Ví dụ nếu mục 4.2 bắt đầu từ A100 và hết bảng dữ liệu Z110 thì nhập fit_Indexes vào hàm FitRow là fit_Indexes(A100:Z110)
Và nhập nhiều vùng fit_Indexes(A100:Z110,A115:Z120)


Ảnh 1 và ảnh 2:

1726811522233-png.304101
1726811745720-png.304102





CÁC HÀM LỆNH TẠO NÚT VÀ BIỂU THỨC NHANH:

HÀMChức năng
=FITROW_AddFX()
Tạo nhanh biểu thức FITROW vào ô
=FITROW_AddFXPrintArea()
Tạo nhanh biểu thức FITROW vùng in vào ô, nếu đang ở trang tính đã đặt vùng in
=FITROW_AddButton()
Tạo nút nhấn để giãn dòng
=FITROW_AddButtonPrintArea()
Tạo nút nhấn để giãn dòng vùng in, nếu đang ở trang tính đã đặt vùng in
=FitRow_Off()
Tắt chế độ tự động giãn dòng
=FitRow_On()
Bật chế độ tự động giãn dòng


Phím tắt giãn dòng: CTRL+SHIFT+ALT+R

Các hàm Bổ trợ:
1. Gõ hàm FITROW_OFF: nếu đang chỉnh sửa trang tính hãy tắt chế độ co giãn dòng hoặc bật chế độ Design Mode trong Tab Developer.
2. Gõ hàm FITROW_ON: Bật chế độ co giãn dòng tự động.
3. Thủ tục FITROW_Toggle + Check box có tên là chxAutoFitRow dùng để bật tắt chế độ co giãn dòng nếu muốn (Ví dụ nằm ở Sheet1 trong tập tin đính kèm bên dưới).
Bước 3 này là một thủ thuật để ngăn chặn code tính toán lúc ứng dụng vừa khởi động, vì có thể sẽ gặp phải tình trạng code sẽ làm chậm quá trình khởi động.
Hãy để dòng code sau vào sự kiện Workbook_Open: Call FITROW_Off
Hãy mở lại bằng bước 2 hoặc bước 3.


****Lưu ý:
  1. Code sẽ tạo trang tính ẩn có tên __CELLFIXING__ để giãn dòng.
  2. Khi giãn dòng tự động chế độ Undo và Redo của trang tính sẽ không hoạt động.
  3. Nếu trong trang tính có hàm giãn dòng, khi sử dụng hàm nhạy như RandBetween, ToDay, Now,... và các hàm random, thì không thêm hàm bổ trợ tự động chạy fit_Auto().

***Sao chép mã vào dự án của bạn phải bao gồm 1 module + mã trong ThisWorkbook
--------------------------------------------------------------------------------------

Liên hệ Facebook Messenger: Vo Truong Anh Tuan
Liên hệ Zalo: 0384170514
Quét QRCode Zalo:

355273851-8b02c95c-4ae3-4cd2-8d0e-e57c3d97a468.jpg
 

File đính kèm

Lần chỉnh sửa cuối:
Giải pháp
*** CẬP NHẬT 2.42: 14/10/2024 ***
Cập nhật mới này sửa một số lỗi trong mã và tăng tốc giãn dòng bằng cách giãn đồng thời các ô giá trị cùng cột
Và thêm các hàm bổ trợ giãn dòng cho Bảng để tiết kiệm hơn trong quá trình giãn dòng, với hàm bổ trợ fit_Tables()

Dự kiến bản cập nhật tiếp theo

Thêm hàm chức năng bổ trợ giãn dòng trước khi in.
Chuyên gia này toàn viết hàm đỉnh cao. Nhưng cũng phải là người đỉnh cao mới dùng được hàm của chuyên gia này.
 
Upvote 0
Bác cho cái video HDSD thì quá tuyệt vời, em mò mà chưa biết cách xài, em tải file mẫu về mỗi lần di chuyển giữa các sheet báo lỗi " Subscripts out of range" . Click vô Debug thì báo lỗi ở dòng này bác @HeSanbi
1731473775238.png
 
Upvote 0
Cám ơn bác thớt đã chia sẻ 1 add-in rất hay nhưng hướng dẫn của bác khó hiểu kinh hoàng. Sau 1 giờ đánh vật với hướng dẫn, em đành dãn trang in bằng cách zoom 85% bấm Autofix Row Height (thỉnh thoảng vẫn có ô bị mất nôi dung nhưng tạm chấp nhận).
Phải chi bác làm đơn giản một chút cho mọi người dễ tiếp cận thì tốt quá. Ví dụ nhập thông số dãn vào sheet Config, chọn vùng cần dãn, bấm chạy Macro => Xong.

P/s: Không hiểu sao add-in nào của bác cũng phải Hàm, Hàm, Hàm mới dùng được :))

1731481243932.png
 
Upvote 0
@Decepticon Lý do dùng hàm là do mỗi kiểu giãn dòng mỗi kiểu dữ liệu, mỗi cách phân bổ dòng cho cái nhìn trực quan là khác nhau
Nên cần dùng hàm để tạo các thông số giãn dòng khác nhau cho mỗi kiểu như vậy.

Hàm có thể lưu thông số, add-in thì chỉ có thể tạo khung công tác để giãn dòng. Nếu bạn tạo dự án có hàng chục hoặc hàng trăm vị trí cần giãn. Thì buộc tận dụng hàm.
Mỗi tiêu đề hay định dạng phông chữ, cho hàng trăm kiểu định dạng to nhỏ lớn bé. Chính vì vậy việc giãn dòng rất phức tạp cho nhiều phương thức biễn diễn phông trên trang tính. Hàm là tối ưu nhất.

Bạn có thể sử dụng giãn dòng nhanh với phím tắt CTRL+SHIFT+ALT+R. Không cần đến Hàm.

Ví dụ điển hình trên chính hình ảnh bạn đính kèm:
Bạn nhìn vào hình bạn chụp sẽ thấy dòng 3, cột D, hiển thị dòng bị quá gần với dòng 4. Làm cho việc nhìn vào sẽ khó nhận biết chúng là hai ô dữ liệu khác nhau. Bây giờ thêm vào hàm FITROW hàm cài đặt fit_Pading(5), có nghĩa là giãn chèn thêm chiều cao là 5.​
Excel có những lỗi giãn dòng sai sót độ chính xác phông chữ do mã nguồn của họ. Điều đó bạn sẽ tìm thấy trên Google và cũng có trên diễn đàn.
 
Lần chỉnh sửa cuối:
Upvote 0
@HeSanbi em đã thử nhưng không dc Bác ơi vẫn báo lỗi như trên video.
(Sau khi sửa bị lỗi em đã trả lại nguyên bản)
Mình biết tại sao lại báo lỗi tại dòng đó, là vì SheetBB nằm trong thủ tục test không tồn tại khi bạn chép mã sang ứng dụng của bạn, bạn xóa thủ tục đó đi, hoặc thêm dấu ngoặc vuông [SheetBB]. Khi chép mã, trên thanh Menu bạn chọn Debug và Nhấn Debug Compile ... xem còn lỗi không.

Hoặc bạn tải lại tệp trên bài viết chính.
 
Lần chỉnh sửa cuối:
Upvote 0
Em tải file gốc của bác về báo lỗi ạ. Xin chia sẻ:
1. em xài office 2019 64 bit
2. Em gỡ ra cài lại office 2024 64bit vẫn báo lỗi
3. Em chuyển file của bác sang máy khác, bản office 2019 64 bit => không lỗi.
4. Chuyển sang 2 máy khác xài office bản quyền => lỗi
Em cũng không biết nguyên nhân. Video dưới là em test cả 2 phiên bản office
 
Upvote 0
Sau khi kiểm tra UltraView cho bạn thì đó không phải là lỗi. Do là bạn chỉnh cách VBA biên dịch bị sai.

Bạn đã đánh dấu Break on All Errors, tức là ngưng khi bất kì lỗi nào xảy ra trong mã VBA dù cho có bẫy lỗi.

Khi lập trình mã VBA hãy đánh dấu như hình dưới đây.

1731575111899.png
 
Upvote 0
Em sử dụng chưa được thạo lắm, nhờ bác xem giúp em
 

File đính kèm

  • 241227_1322_39.jpg
    241227_1322_39.jpg
    66.8 KB · Đọc: 5
  • 241227_1322_30.jpg
    241227_1322_30.jpg
    80.4 KB · Đọc: 5
  • 241227_1322_11.jpg
    241227_1322_11.jpg
    123.2 KB · Đọc: 5
  • 241227_1322_06.jpg
    241227_1322_06.jpg
    123.4 KB · Đọc: 5
Upvote 0
Web KT

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

Back
Top Bottom