Cho em xin code tự động điều chỉnh độ cao của dòng dữ liệu. (Dòng dữ liệu và dòng kết quả đã Merge cell). Em xin cảm ơn!
Xem bài này:
http://www.giaiphapexcel.com/forum/showthread.php?6773-T%E1%BB%B1-%C4%91%E1%BB%99ng-%C4%91i%E1%BB%81u-ch%E1%BB%89nh-%C4%91%E1%BB%99-cao-c%E1%BB%A7a-d%C3%B2ng
Toàn bộ code cho vào sheet mà bạn muốn chỉnh
Em cảm ơn anh nhiều! về cơ bản là em đã đạt được mong muốn. Em muốn hỏi thêm một chút là trong sheet em chỉ muốn nó có tác động đến một số dòng đã định trước, không phải là tất cả các dòng thì làm như thế nào ạ?
Xin cảm ơn anh nhiều!
Private Sub Worksheet_Change(ByVal Target As Range)
Call AutoFitMergedCellRowHeight(Target)
End Sub
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
OH, anh ơi cái code autofix chỉ là tự động dãn độ cao thôi, không tự co lại được, anh xem giúp em nhé. Thanks anh!
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
Bạn hãy thay sub AutoFitMergedCellRowHeight của bạn bằng sub AutoFitMergedCellRowHeight của tôi xem
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ẫn chưa được các anh ơi. Các anh xem lại hộ em nhé, vấn đề của em ghi rõ lại ở file autofix1 rồi. Em xin cảm ơn ạ!
Private Sub Worksheet_Activate()
Range("C7").EntireRow.AutoFit
End Sub
Vẫn chưa được các anh ơi. Các anh xem lại hộ em nhé, vấn đề của em ghi rõ lại ở file autofix1 rồi. Em xin cảm ơn ạ!
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
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 ạ. các anh xem lại file autofix1 hộ em
Cell kết quả nếu chỉ là một ô thì theo các anh hướng dẫn là okie
Em test rồi anh ạ, file autofix2 của anh, nếu mà Merge (ví dụ từ C7:F7) vẫn chưa được ạ, anh check lại giúp em với!Thì bạn cứ merge thoải mái đi, từ ô C7:F7 chẳng hạn, thử chạy trên file tôi mới gửi xem sao!
Dạ, tại dữ liệu của em có liên quan đến bảng tính anh ah, nên phải Merge anh ah. Nếu không được thì có thể làm theo cách đếm ký tự được không anh? Ví dụ là lớn hơn x ký tự (x có thể do mình tùy chọn) để điều chỉnh độ cao của dòng?Sorry bạn, kể cả tôi dùng thủ công đi chăng nữa thì nó cũng không thể nào FIT được khi khối ô là MERGE CELLS. Nên không thể thực hiện code trong trường hợp này được!
Nhưng có nhất thiết phải Merge không, bởi vì ta có thể co giản độ rộng của cột?
Dạ, tại dữ liệu của em có liên quan đến bảng tính anh ah, nên phải Merge anh ah. Nếu không được thì có thể làm theo cách đếm ký tự được không anh? Ví dụ là lớn hơn x ký tự (x có thể do mình tùy chọn) để điều chỉnh độ cao của dòng?
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$12" Then
Dim w As Double, h As Double, i As Byte
With Application
.EnableEvents = False
.Calculation = xlCalculationManual
Sheet1.Range("C7").Value = Target.Value
With Sheet1.Range("C6") 'Lay o tren 1 hang
For i = 0 To 3 'Neu merge là 4 ô
w = w + .Offset(, i).ColumnWidth
Next
End With
With Sheet1.Range("IT7") 'Lay mot ô phu (cuoi sheet) lam cot trung gian
.Value = Target.Value
.ColumnWidth = w
.EntireRow.AutoFit
h = .RowHeight
.Clear
.RowHeight = h
End With
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
End If
End Sub
With Sheet1.Range("IT7") 'Lay mot ô phu (cuoi sheet) lam cot trung gian
.Value = Target.Value
[COLOR=#ff0000][B].WrapText = True[/B][/COLOR]
.ColumnWidth = w
.EntireRow.AutoFit
h = .RowHeight
.Clear
.RowHeight = h
End With
Cảm ơn rất nhiều vì sự nhiệt tình của anh. Em test thử rồi, code ngon lành anh ah. Thanks anh nhiều nhé!!!!!!!Cái code này là chữa cháy cho bạn đây, không biết bạn thấy thế nào:
PHP:Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$12" Then Dim w As Double, h As Double, i As Byte With Application .EnableEvents = False .Calculation = xlCalculationManual Sheet1.Range("C7").Value = Target.Value With Sheet1.Range("C6") 'Lay o tren 1 hang For i = 0 To 3 'Neu merge là 4 ô w = w + .Offset(, i).ColumnWidth Next End With With Sheet1.Range("IT7") 'Lay mot ô phu (cuoi sheet) lam cot trung gian .Value = Target.Value .ColumnWidth = w .EntireRow.AutoFit h = .RowHeight .Clear .RowHeight = h End With .Calculation = xlCalculationAutomatic .EnableEvents = True End With End If End Sub
Tôi dùng một trong những ô cuối cùng hàng với ô C7 làm ô trung gian, sau khi xử lý hàng xong thì tôi xóa ô này đi, phần còn lại đã được giải quyết. Thử gõ vào ô C12 của sheet2 rồi mở sheet1 xem sao nhé!
Bạn thấy thế nào?
============================================
À, để đảm bảo luôn luôn đúng trong mọi trường hợp, bạn thêm vào code 1 chút xíu thủ tục .WrapText = True nhé!
Mã:With Sheet1.Range("IT7") 'Lay mot ô phu (cuoi sheet) lam cot trung gian .Value = Target.Value [COLOR=#ff0000][B].WrapText = True[/B][/COLOR] .ColumnWidth = w .EntireRow.AutoFit h = .RowHeight .Clear .RowHeight = h End With
Cảm ơn rất nhiều vì sự nhiệt tình của anh. Em test thử rồi, code đứng im, ko chạy anh ah
Bạn bị ngăn sự kiện rồi!
Trong VBA, bạn bấm Ctrl+G để mở cửa sổ Immediate, sau đó bạn copy dòng này:
Application.EnableEvents = True
Rồi đặt con trỏ vô dòng lệnh đó rồi bấm nút Enter. Thực hiện xong thì bạn thử làm gì đó trên ô C12 xem sao!