Nếu muốn kỹ hơn, chỉ thay đổi độ cao của ô C7 của sheet1 khi ô C12 ở sheet2 thay đổi thì làm thủ tục sau:
Tại module của sheet2 bạn thực hiện thủ tục sau:
PHP:Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$12" Then With Application .EnableEvents = False .Calculation = xlCalculationManual With Sheet1.Range("C7") .Value = Target.Value .EntireRow.AutoFit End With .Calculation = xlCalculationAutomatic .EnableEvents = True End With End If End Sub
Bây giờ bạn gõ gì ở ô C12 thì ô C7 cũng thay đổi theo (không cần công thức) và tự động fit hàng.
Dạ! Em cảm ơn các anh ạ! Nhưng mà vấn đề của em vẫn còn mắc tý chút là cái cell kết quả không phải 1 ô, mà là nhiều cell đã được Merge lại rồi ạ.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("C12") Then
AutoFitMergedCellRowHeight Sheet1.Range("C7")
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("C7") Then
AutoFitMergedCellRowHeight Target
End If
End Sub
Sub AutoFitMergedCellRowHeight(Target As Range)
Dim NewRwHt As Single
Dim cWdth As Single, MrgeWdth As Single
Dim c As Range, cc As Range
Dim ma As Range
With Target
If .MergeCells And .WrapText Then
Set c = Target.Cells(1, 1)
cWdth = c.ColumnWidth
Set ma = c.MergeArea
For Each cc In ma.Cells
MrgeWdth = MrgeWdth + cc.ColumnWidth
Next
Application.ScreenUpdating = False
ma.MergeCells = False
c.ColumnWidth = MrgeWdth
c.EntireRow.AutoFit
NewRwHt = c.RowHeight
c.ColumnWidth = cWdth
ma.MergeCells = True
ma.RowHeight = NewRwHt
cWdth = 0: MrgeWdth = 0
Application.ScreenUpdating = True
End If
End With
End Sub
Với code như trên bạn có 2 lựa chọn:
1. Một ngày đẹp trời bạn gõ công thức vào Sheet 1!C7, vd. =Sheet2!C12. Khi bạn thay đổi text trong Sheet2!C12 thì ô Sheet1!C7 tự động co dãn.
2. Một ngày xấu trời bạn xóa công thức trong Sheet1!C7 và bạn muốn gõ text trực tiếp trong C7. Bạn cứ gõ tự nhiên và ô C7 tự co dãn.
Sub của tôi là viết tổng quát để bạn tùy cơ ứng biến, xử dụng trong mỗi trường hợp.
Với code trong bài #17 thì nếu tôi không lầm thì bạn chỉ thao tác được khi ngày đẹp trời mà thôi. Tức bạn chỉ có 1 khả năng.
Bạn ạ, các anh nào ở đây?
Tôi là người trả lời rất có trách nhiệm. Tôi thường đọc kỹ câu hỏi. Và do tôi tải tập tin AutoFit.xls trong bài #6 nên tôi biết rõ là cell C7 của bạn được merge.
Chỉ có điều giúp bạn rất khó. Bạn không miêu tả bạn đã thao tác lần lượt như thế nào. Và bạn không trước sau như một. Lúc thì bạn đưa tập tin mà text trong cell được nhập vào bằng công thức, lúc thì chả có công thức (AutoFit.xls ở bài #6) - người đọc sẽ đoán mò là text được nhập vào bằng cách gõ trực tiếp.
Code tôi đưa trong bài #10 được viết đặc biệt cho các cell merge.
Do bạn gọi sub AutoFitMergedCellRowHeight trong Worksheet_Change của Sheet1 nên chỉ khi sẩy ra sự kiện thì sub AutoFitMergedCellRowHeight mới được thực hiện.
Vậy thì nếu ta "làm gì đó" mà không sẩy ra Worksheet_Change của Sheet1 nhưng ta vẫn muốn sub AutoFitMergedCellRowHeight được thực hiện thì làm thế nào? Thì ... cứ gọi nó thôi chứ có ai cấm đâu???
Code của Sheet2:
Mã:Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("C12") Then AutoFitMergedCellRowHeight Sheet1.Range("C7") End If End Sub
Ta thêm code của Sheet1:
Mã:Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("C7") Then AutoFitMergedCellRowHeight Target End If End Sub
Và code Module1 với sub của tôi ở bài #10
Mã:Sub AutoFitMergedCellRowHeight(Target As Range) Dim NewRwHt As Single Dim cWdth As Single, MrgeWdth As Single Dim c As Range, cc As Range Dim ma As Range With Target If .MergeCells And .WrapText Then Set c = Target.Cells(1, 1) cWdth = c.ColumnWidth Set ma = c.MergeArea For Each cc In ma.Cells MrgeWdth = MrgeWdth + cc.ColumnWidth Next Application.ScreenUpdating = False ma.MergeCells = False c.ColumnWidth = MrgeWdth c.EntireRow.AutoFit NewRwHt = c.RowHeight c.ColumnWidth = cWdth ma.MergeCells = True ma.RowHeight = NewRwHt cWdth = 0: MrgeWdth = 0 Application.ScreenUpdating = True End If End With End Sub
-------------
Với code như trên bạn có 2 lựa chọn:
1. Một ngày đẹp trời bạn gõ công thức vào Sheet 1!C7, vd. =Sheet2!C12. Khi bạn thay đổi text trong Sheet2!C12 thì ô Sheet1!C7 tự động co dãn.
2. Một ngày xấu trời bạn xóa công thức trong Sheet1!C7 và bạn muốn gõ text trực tiếp trong C7. Bạn cứ gõ tự nhiên và ô C7 tự co dãn.
Sub của tôi là viết tổng quát để bạn tùy cơ ứng biến, xử dụng trong mỗi trường hợp.
Với code trong bài #17 thì nếu tôi không lầm thì bạn chỉ thao tác được khi ngày đẹp trời mà thôi. Tức bạn chỉ có 1 khả năng.
Anh siwtom ơi, anh cho em hỏi thêm vấn đề này nhé. Code của anh em dùng rất ok nhưng phát sinh một vấn đề là: Nếu việc đặt column width càng nhỏ thì độ cao của dòng kết quả sẽ bị thừa tương đối. Giả sử em định dạng ô kết quả như sau: Format Cells/Alignment/Vretical (center) thì sẽ thừa trên và thừa dưới tương đối nhiều.
Em gửi anh file TestautoFix anh xem lại hộ em nhé. Em để kết quả thể hiện cả 3 sheet là sheet1, sheet3 và sheet4
Có cách nào mà dù căn được chiều cao mà không phụ thuộc vào column width không anh?
Anh siwtom ơi, anh cho em hỏi thêm vấn đề này nhé. Code của anh em dùng rất ok nhưng phát sinh một vấn đề là: Nếu việc đặt column width càng nhỏ thì độ cao của dòng kết quả sẽ bị thừa tương đối. Giả sử em định dạng ô kết quả như sau: Format Cells/Alignment/Vretical (center) thì sẽ thừa trên và thừa dưới tương đối nhiều.
Em gửi anh file TestautoFix anh xem lại hộ em nhé. Em để kết quả thể hiện cả 3 sheet là sheet1, sheet3 và sheet4
Có cách nào mà dù căn được chiều cao mà không phụ thuộc vào column width không anh?
Tôi cũng không hiểu sao như vậy. Tôi cũng thử kiếm cách sửa code nhưng không thành công. Thôi tôi đành chịu thua. Phất cờ trắng đầu hàng.
Các sư phụ vào giúp chủ topic với.
Tmp = cc.ColumnWidth
MrgeWdth = MrgeWdth + Tmp + 0.45 * IIf(Tmp <= 0.6, Tmp / 0.67, 1.1)
Sub AutoFitMergedCellRowHeight(Target As Range)
Dim cWdth As Single, MrgeWdth As Single, NewRwHt As Single, Tmp As Single
Dim c As Range, cc As Range, ma As Range
If Target.MergeCells And Target.WrapText Then
Application.ScreenUpdating = False
Set c = Target.Cells(1, 1): cWdth = c.ColumnWidth: Set ma = c.MergeArea
For Each cc In ma.Resize(1)
Tmp = cc.ColumnWidth
MrgeWdth = MrgeWdth + Tmp + 0.45 * IIf(Tmp <= 0.6, Tmp / 0.67, 1.1)
Next cc
ma.MergeCells = False
c.ColumnWidth = MrgeWdth: c.EntireRow.AutoFit: NewRwHt = c.RowHeight / ma.Rows.Count
c.ColumnWidth = cWdth: ma.MergeCells = True
For Each cc In ma.Resize(, 1)
cc.RowHeight = NewRwHt
Next cc
Application.ScreenUpdating = True
End If
End Sub
code trong file kèm, cũng đã sửa thêm cho linh động cho phép merged các ô từ nhiều rows (khi đó độ cao các rows sẽ fit bằng nhau và tổng đủ autofit)
chú ý: Gia số điều chỉnh-tạm lấy theo test các trường hợp==> người dùng code vận dụng sao uyển chuyển và thay đổi hợp lý với cụ thể các trường hợp của mình
Sub AutoFitMergedCellRowHeight(Target As Range)
Dim cWdth As Single, MrgeWdth As Single, NewRwHt As Single, Tmp As Single
Dim c As Range, cc As Range, ma As Range
If Target.MergeCells And Target.WrapText Then
Application.ScreenUpdating = False
Set c = Target.Cells(1, 1)
With c
cWdth = .ColumnWidth: Set ma = .MergeArea
For Each cc In ma.Resize(1)
Tmp = cc.ColumnWidth
MrgeWdth = MrgeWdth + Tmp + 0.45 * IIf(Tmp <= 0.6, Tmp / 0.67, 1.1)
Next cc
ma.MergeCells = False: .ColumnWidth = MrgeWdth
.EntireRow.AutoFit: NewRwHt = .RowHeight / ma.Rows.Count: .ColumnWidth = cWdth
ma.MergeCells = True: ma.RowHeight = NewRwHt
End With
Application.ScreenUpdating = True
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("C16") Then
On Error GoTo 1
Application.EnableEvents = False
AutoFitMergedCellRowHeight Sheet1.Range("D18")
AutoFitMergedCellRowHeight Sheet3.Range("D18")
AutoFitMergedCellRowHeight Sheet4.Range("D18")
AutoFitMergedCellRowHeight Sheet5.Range("D18")
AutoFitMergedCellRowHeight Sheet6.Range("D18")
AutoFitMergedCellRowHeight Sheet7.Range("D18")
1: Application.EnableEvents = True
End If
End Sub
xem file kèm, và đọc các dòng sau,
Đó là vì sự õng ẹo của Excel khi đối xử độ rộng thật sự và độ rộng đo qua column.width (thực ra là mỗi column, ngoài số đo đó excel còn chừa lề cho text)
Vì thê cần thêm 1 gia số điều chỉnh bác siwtom ah
cụ thể thêm như sau cho đoạn tính Mrgewidth
PHP:Tmp = cc.ColumnWidth MrgeWdth = MrgeWdth + Tmp + 0.45 * IIf(Tmp <= 0.6, Tmp / 0.67, 1.1)
code trong file kèm, cũng đã sửa thêm cho linh động cho phép merged các ô từ nhiều rows (khi đó độ cao các rows sẽ fit bằng nhau và tổng đủ autofit)
chú ý: Gia số điều chỉnh-tạm lấy theo test các trường hợp==> người dùng code vận dụng sao uyển chuyển và thay đổi hợp lý với cụ thể các trường hợp của mình
và code đầy đủ Sub AutoFitMergedCellRowHeight
PHP:Sub AutoFitMergedCellRowHeight(Target As Range) Dim cWdth As Single, MrgeWdth As Single, NewRwHt As Single, Tmp As Single Dim c As Range, cc As Range, ma As Range If Target.MergeCells And Target.WrapText Then Application.ScreenUpdating = False Set c = Target.Cells(1, 1): cWdth = c.ColumnWidth: Set ma = c.MergeArea For Each cc In ma.Resize(1) Tmp = cc.ColumnWidth MrgeWdth = MrgeWdth + Tmp + 0.45 * IIf(Tmp <= 0.6, Tmp / 0.67, 1.1) Next cc ma.MergeCells = False c.ColumnWidth = MrgeWdth: c.EntireRow.AutoFit: NewRwHt = c.RowHeight / ma.Rows.Count c.ColumnWidth = cWdth: ma.MergeCells = True For Each cc In ma.Resize(, 1) cc.RowHeight = NewRwHt Next cc Application.ScreenUpdating = True End If End Sub
Sửa lại AutoFitMergedCellRowHeight cho chuẩn và nhanh hơn
vẫn lưu ý về Gia số điều chỉnh như bài trước
PHP:Sub AutoFitMergedCellRowHeight(Target As Range) Dim cWdth As Single, MrgeWdth As Single, NewRwHt As Single, Tmp As Single Dim c As Range, cc As Range, ma As Range If Target.MergeCells And Target.WrapText Then Application.ScreenUpdating = False Set c = Target.Cells(1, 1) With c cWdth = .ColumnWidth: Set ma = .MergeArea For Each cc In ma.Resize(1) Tmp = cc.ColumnWidth MrgeWdth = MrgeWdth + Tmp + 0.45 * IIf(Tmp <= 0.6, Tmp / 0.67, 1.1) Next cc ma.MergeCells = False: .ColumnWidth = MrgeWdth .EntireRow.AutoFit: NewRwHt = .RowHeight / ma.Rows.Count: .ColumnWidth = cWdth ma.MergeCells = True: ma.RowHeight = NewRwHt End With Application.ScreenUpdating = True End If End Sub
Tại code gọi sub AutoFitMergedCellRowHeight ở trang code-sheet của sheet2 sửa thành
PHP:Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("C16") Then On Error GoTo 1 Application.EnableEvents = False AutoFitMergedCellRowHeight Sheet1.Range("D18") AutoFitMergedCellRowHeight Sheet3.Range("D18") AutoFitMergedCellRowHeight Sheet4.Range("D18") AutoFitMergedCellRowHeight Sheet5.Range("D18") AutoFitMergedCellRowHeight Sheet6.Range("D18") AutoFitMergedCellRowHeight Sheet7.Range("D18") 1: Application.EnableEvents = True End If End Sub
Bạn thử nhập vào ô C16 của sheet2 text = 2 lần text hiện có và viết thêm hic hic. Bạn sẽ thấy text tại sheet1, 3, và 4 bị cụt. Nếu với mỗi text mới trong C16 lại phải test để xác định hệ số sai số thì kéo dòng bằng chuột nhanh hơn.
Vâng, vấn đề của em thì ok rồi anh ạ. Em chia nhỏ cột ra như vậy là vì lý do file excel của em dùng để làm báo cáo, trong báo cáo vừa có nhiều bảng dữ liệu, lại có chỗ nhiều phần soạn thảo nữa. Nên em để cột nhỏ như vậy sẽ căn chỉnh chính xác và phù hợp với công việc của em hơn anh ah.Thua, có thể gia số điều chỉnh còn phụ thuộc độ dài, kích cỡ font chữ ....... (cái này chắc phải đợi Microsoft khi nào opensource bộ office mới hiểu bản chất được)
Mà bài này như viết cho vui vậy, chứ trong 1 file excel thông thường mấy khi ng ta merged cell đâu, có chăng thì khoảng 5-7 cells --> khi đó làm tay nhanh hơn
Vậy thì ngon nữa thì đẩy cái gia số về người dùng tự nhập vào thui, hihihii
túm lại, là người dùng quyết định món ăn: đặc sản ngon thì lại độc, bình dân thì phải chấp nhận khổ hihiiiiiiii
cách này đầy trên diễn đàn đấy bạn. tham khảo đại 1 trang này nhaEm có file BBNT. em muốn khi thay đổi tên công việc tại các biên bản nghiệm thu thì dòng tên công việc tự động thay đổi kích thước..e đã tham khảo các bài viết trong topic nhưng chưa làm được. Các anh có thể giúp em được không a.
Cảm ơn các anh nhiều.!.
Thầy ơi E chạy đoạn Code trên thấy báo lỗi, mong thầy giúp Em , E cám ơn thầyĐoạn code này:
Bạn sửa thành:Mã:Private Sub Worksheet_Change(ByVal Target As Range) Call AutoFitMergedCellRowHeight(Target) End Sub
Cái gì gì đó chính là vùng mà bạn muốn giới hạn (chẳng hạn là A1:A100)Mã:Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Range("[COLOR=#ff0000][B]gì gì đó[/B][/COLOR]"), Target) is Nothing then If Target.Count = 1 then Call AutoFitMergedCellRowHeight(Target) End If End Sub