Giúp code chỉnh độ rộng dòng theo ký tự trong ô (1 người xem)

Liên hệ QC

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

minhtuan55

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
23/3/16
Bài viết
705
Được thích
52
Chào cả nhà GPE !
Em cần 1 đoạn code để chỉnh độ rộng dòng theo tổng ký tự trong ô
Ví dụ vùng cần chỉnh độ rộng: B6:B100
- Nếu ô đó có tổng ký tự >= 15 thì độ rộng 30 Pixel
- Còn tất cả trường hợp còn lại ( tổng ký tự < 15, ô trống, ô báo lỗi NA, Lồi NS....) thì độ rộng 15 Pixel

Mục đích làm: Em thường xuyên in báo cáo, do các tên hàng nó dài nên em muốn nó tự động xuống dòng đúng Chính xác do em quy định

Em đã tự viết code sau mà nó báo lỗi chẳng biết sao
Mã:
 Sub GPE()
Dim Cll As Range
For Each Cll In Range("B6:B25").Value
    If Len(Cll) >= 10 Then
       Cll.RowHeight = 14
    Else
       Cll.RowHeight = 30
    End If
    
Next Cll
End Sub

Xin chân thành cảm ơn !
 

File đính kèm

Chào cả nhà GPE !
Em cần 1 đoạn code để chỉnh độ rộng dòng theo tổng ký tự trong ô
Ví dụ vùng cần chỉnh độ rộng: B6:B100
- Nếu ô đó có tổng ký tự >= 15 thì độ rộng 30 Pixel
- Còn tất cả trường hợp còn lại ( tổng ký tự < 15, ô trống, ô báo lỗi NA, Lồi NS....) thì độ rộng 15 Pixel

Mục đích làm: Em thường xuyên in báo cáo, do các tên hàng nó dài nên em muốn nó tự động xuống dòng đúng Chính xác do em quy định

Em đã tự viết code sau mà nó báo lỗi chẳng biết sao
Mã:
 Sub GPE()
Dim Cll As Range
For Each Cll In Range("B6:B25").Value
    If Len(Cll) >= 10 Then
       Cll.RowHeight = 14
    Else
       Cll.RowHeight = 30
    End If
   
Next Cll
End Sub

Xin chân thành cảm ơn !
Bạn thử nhé!
Mã:
Sub GPE()
    Dim i As Integer
    
    For i = 6 To 25
        If WorksheetFunction.IsError(Cells(i, 2).Value) = True Then
            Rows(i).RowHeight = 15
        ElseIf Len(Cells(i, 2).Value) >= 15 Then
            Rows(i).RowHeight = 30
        Else
            Rows(i).RowHeight = 15
        End If
    Next
End Sub
 
Upvote 0
Chào cả nhà GPE !
Em cần 1 đoạn code để chỉnh độ rộng dòng theo tổng ký tự trong ô
Ví dụ vùng cần chỉnh độ rộng: B6:B100
- Nếu ô đó có tổng ký tự >= 15 thì độ rộng 30 Pixel
- Còn tất cả trường hợp còn lại ( tổng ký tự < 15, ô trống, ô báo lỗi NA, Lồi NS....) thì độ rộng 15 Pixel

Mục đích làm: Em thường xuyên in báo cáo, do các tên hàng nó dài nên em muốn nó tự động xuống dòng đúng Chính xác do em quy định

Em đã tự viết code sau mà nó báo lỗi chẳng biết sao
Mã:
 Sub GPE()
Dim Cll As Range
For Each Cll In Range("B6:B25").Value
    If Len(Cll) >= 10 Then
       Cll.RowHeight = 14
    Else
       Cll.RowHeight = 30
    End If
   
Next Cll
End Sub

Xin chân thành cảm ơn !
Bạn thử:
PHP:
Sub abc()
    Dim Rng As Range, Cll As Range
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    With Sheets(1)
        Set Rng = .Range("b6", .Range("b" & Rows.Count).End(xlUp)).SpecialCells(2)
    End With
    For Each Cll In Rng
        If Len(Cll.Value) >= 10 Then
            Cll.EntireRow.RowHeight = 14
        Else
            Cll.EntireRow.RowHeight = 30
        End If
    Next Cll
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Chào cả nhà GPE !
Em cần 1 đoạn code để chỉnh độ rộng dòng theo tổng ký tự trong ô
Ví dụ vùng cần chỉnh độ rộng: B6:B100
- Nếu ô đó có tổng ký tự >= 15 thì độ rộng 30 Pixel
- Còn tất cả trường hợp còn lại ( tổng ký tự < 15, ô trống, ô báo lỗi NA, Lồi NS....) thì độ rộng 15 Pixel

Mục đích làm: Em thường xuyên in báo cáo, do các tên hàng nó dài nên em muốn nó tự động xuống dòng đúng Chính xác do em quy định

Em đã tự viết code sau mà nó báo lỗi chẳng biết sao
Mã:
 Sub GPE()
Dim Cll As Range
For Each Cll In Range("B6:B25").Value
    If Len(Cll) >= 10 Then
       Cll.RowHeight = 14
    Else
       Cll.RowHeight = 30
    End If
   
Next Cll
End Sub

Xin chân thành cảm ơn !
1/ Chiều cao dòng chẳng liên quan gì đến chuyện "tự động xuống dòng..."
2/ For Each Cll In Range("B6:B25").Value <--- Bỏ .Value
3/ Những ô bị lỗi sẽ gây lỗi cho Len(Cll)
Chuỗi >=10 thì cao 14 (ngược lại chỉ 1 vài ký tự thì cao 30)
Cuối cùng chẳng hiểu bạn muốn làm gì.
Thà bạn nói rõ mục đích muốn có, mọi người sẽ đưa ra nhiều lựa chọn cho bạn.
Tự bạn "nghĩ ra" cái con đường "ngoằn ngoèo lắt léo" rồi hỏi làm sao dọn dẹp sạch sẽ chướng ngại.
 
Upvote 0
Chào cả nhà GPE !


Mục đích làm: Em thường xuyên in báo cáo, do các tên hàng nó dài nên em muốn nó tự động xuống dòng đúng Chính xác do em quy định
Cái này đâu có gộp ô đâu mà cần phải định chiều cao cố định (14 hoặc 30). Để chữ vừa khít ô chỉ cần AutoFit Row Height là được rồi
 
Upvote 0
Cái này đâu có gộp ô đâu mà cần phải định chiều cao cố định (14 hoặc 30). Để chữ vừa khít ô chỉ cần AutoFit Row Height là được rồi
Chủ thớt yêu cầu chỉnh độ rộng của dòng và nói cái code bị lỗi nên không cần quan tâm tới cái code (có row height) nữa.
 
Upvote 0
Việc chỉnh kích thước của dòng/ cột về đơn vị pixel thì cũng còn xem cái vụ đơn vị tính...

"On a worksheet, you can specify a column width of 0 (zero) to 255. This value represents the number of characters that can be displayed in a cell that is formatted with the standard font. The default column width is 8.43 characters. If a column has a width of 0 (zero), the column is hidden.

You can specify a row height of 0 (zero) to 409. This value represents the height measurement in points (1 point equals approximately 1/72 inch or 0.035 cm). The default row height is 12.75 points (approximately 1/6 inch or 0.4 cm). If a row has a height of 0 (zero), the row is hidden."
------
Link: https://support.office.com/en-us/ar...w-height-72f5e3cc-994d-43e8-ae58-9774a0905f46

Unit of row height is point: 1 point = 1/72 inch = (1/72) x 96 PPI (giả thiết màn hình có độ phân giải 96 pixel per inch) = 4/3 pixel
Unit of column width: 1 column unit width = 7 + 5 pixel | n column unit width = 7n + 5 pixel (cái này thì không rõ).

------
https://social.msdn.microsoft.com/F...-setting-column-width-in-pixel?forum=exceldev


 
Lần chỉnh sửa cuối:
Upvote 0
1/ Chiều cao dòng chẳng liên quan gì đến chuyện "tự động xuống dòng..."
2/ For Each Cll In Range("B6:B25").Value <--- Bỏ .Value
3/ Những ô bị lỗi sẽ gây lỗi cho Len(Cll)
Chuỗi >=10 thì cao 14 (ngược lại chỉ 1 vài ký tự thì cao 30)
Cuối cùng chẳng hiểu bạn muốn làm gì.
Thà bạn nói rõ mục đích muốn có, mọi người sẽ đưa ra nhiều lựa chọn cho bạn.
Tự bạn "nghĩ ra" cái con đường "ngoằn ngoèo lắt léo" rồi hỏi làm sao dọn dẹp sạch sẽ chướng ngại.

Dạ. E nói 1 cách ngắn gọn. Ô nào có tổng ký tự >=15 thì dòng đó có chiều cao là 30 Pixel, còn Tất cả trường hợp còn lại thì 15 Pixel. Còn mục đích thì em áp dụng cho vấn đề in ấn. em có thử định dạng Wrap text rồi như chưa ưng ý lắm
 
Upvote 0
Hiện tại cty em cũng cần phải căn chỉnh trang giấy, nếu lặp theo công thức của bạn HieuCD, và mình muốn thêm ví dụ như là nếu ký tự ô đó là từ 1~88 thì rowheight=15,89~188=30,189~260=45,261~334=60 thì phải thêm code thế nào ah và nếu 1 file excel có nhiều sheet mình muốn chạy hết tất cả sheet trong file đó thì phải làm thế nào ah. Xin thỉnh giáo cao nhân
#14
HieuCD đã viết:
Mã:
Sub GPE()
Dim Cll As Range
For Each Cll In Range("B6:B25")
If Len(CStr(Cll)) >= 15 Then Cll.RowHeight = 30 Else Cll.RowHeight = 15
Next Cll
End Sub
 

File đính kèm

Upvote 0
Hiện tại cty em cũng cần phải căn chỉnh trang giấy, nếu lặp theo công thức của bạn HieuCD, và mình muốn thêm ví dụ như là nếu ký tự ô đó là từ 1~88 thì rowheight=15,89~188=30,189~260=45,261~334=60 thì phải thêm code thế nào ah và nếu 1 file excel có nhiều sheet mình muốn chạy hết tất cả sheet trong file đó thì phải làm thế nào ah. Xin thỉnh giáo cao nhân
#14
HieuCD đã viết:
Mã:
Sub GPE()
Dim Cll As Range
For Each Cll In Range("B6:B25")
If Len(CStr(Cll)) >= 15 Then Cll.RowHeight = 30 Else Cll.RowHeight = 15
Next Cll
End Sub
Mã:
Sub GPE()
  Dim Sh As Worksheet, Cll As Range, StrLen As Double
  For Each Sh In Sheets
    For Each Cll In Sh.Range("C1", Sh.Range("C65500").End(xlUp))
      StrLen = Len(Cll.Value)
      Select Case StrLen
        Case 0 To 88:     Cll.RowHeight = 15
        Case 89 To 188:   Cll.RowHeight = 30
        Case 189 To 260:  Cll.RowHeight = 45
        Case 261 To 334:  Cll.RowHeight = 60
      End Select
    Next Cll
  Next Sh
End Sub
 
Upvote 0
Mã:
Sub GPE()
  Dim Sh As Worksheet, Cll As Range, StrLen As Double
  For Each Sh In Sheets
    For Each Cll In Sh.Range("C1", Sh.Range("C65500").End(xlUp))
      StrLen = Len(Cll.Value)
      Select Case StrLen
        Case 0 To 88:     Cll.RowHeight = 15
        Case 89 To 188:   Cll.RowHeight = 30
        Case 189 To 260:  Cll.RowHeight = 45
        Case 261 To 334:  Cll.RowHeight = 60
      End Select
    Next Cll
  Next Sh
End Sub
Code có vẻ ổn, nhưng có vấn đề là chữ và số thì khi mình cố định bằng công thức len có vẻ nó bị sai lệch khi ô đó có thể hiện chữ số và ký tự đặc biệt khi view nó sẽ không bị ẩn dòng , Bác có hàm nào để thay thế hàm len không ah
 
Upvote 0
Code có vẻ ổn, nhưng có vấn đề là chữ và số thì khi mình cố định bằng công thức len có vẻ nó bị sai lệch khi ô đó có thể hiện chữ số và ký tự đặc biệt khi view nó sẽ không bị ẩn dòng , Bác có hàm nào để thay thế hàm len không ah
Gởi file thật lên mới tính dùng cách nào
 
Upvote 0
Gởi file thật lên mới tính dùng cách nào
Bác xem giúp mình những dòng highlight màu vàng nhé, và bác xem giúp e nếu dòng STT 67 nếu cột B chữ bị cho xuống dòng, những vì cột C dòng đó không lớn 88 ký tự sẽ bị chuyển về dòng đó độ rộng 15 và cột B sẽ bị mất chữ
 

File đính kèm

Upvote 0
Chữ I mà dài bằng chữ W là sai từ lúc đặt vấn đề rồi.
 
Upvote 0
Bác xem giúp mình những dòng highlight màu vàng nhé, và bác xem giúp e nếu dòng STT 67 nếu cột B chữ bị cho xuống dòng, những vì cột C dòng đó không lớn 88 ký tự sẽ bị chuyển về dòng đó độ rộng 15 và cột B sẽ bị mất chữ
Thử code, nhớ xem ghi chú
Mã:
Sub GPE()
  Dim Sh As Worksheet, i As Long, eR As Long
  Application.ScreenUpdating = False
  For Each Sh In Sheets
    eR = Sh.Range("C65500").End(xlUp).Row
    Sh.Rows("1:" & eR).EntireRow.AutoFit
    Sh.Range("A1:C" & eR).VerticalAlignment = xlCenter
    ' Neu thay khong dep thì chay 3 dòng lenh duoi, toc do se rat cham
    'For i = 1 To eR
      'Sh.Rows(i).RowHeight = Sh.Rows(i).RowHeight + 0.6
    'Next i
  Next Sh
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
Thử code, nhớ xem ghi chú
Mã:
Sub GPE()
  Dim Sh As Worksheet, i As Long, eR As Long
  Application.ScreenUpdating = False
  For Each Sh In Sheets
    eR = Sh.Range("C65500").End(xlUp).Row
    Sh.Rows("1:" & eR).EntireRow.AutoFit
    Sh.Range("A1:C" & eR).VerticalAlignment = xlCenter
    ' Neu thay khong dep thì chay 3 dòng lenh duoi, toc do se rat cham
    'For i = 1 To eR
      'Sh.Rows(i).RowHeight = Sh.Rows(i).RowHeight + 0.6
    'Next i
  Next Sh
  Application.ScreenUpdating = True
End Sub
Code này chạy được nhưng khi chạy thêm 3 dòng dưới tốc độ chậm quá, bạn và mọi người cải thiện tốc độ lại với;
Nhờ mọi người tạm sửa cho code trên chỉ áp dụng cho sheet hiện hành thôi, Do cấu trúc của các Sheet có thể khác nhau
Em đã sửa chỉ cho áp dụng cho sheet hiện hành nhưng vẫn chậm
Sub GPE()
Dim i As Long, eR As Long
Application.ScreenUpdating = False
eR = ActiveSheet.Range("C65500").End(xlUp).Row
ActiveSheet.Rows("7:" & eR).EntireRow.AutoFit
ActiveSheet.Range("A7:C" & eR).VerticalAlignment = xlCenter
ActiveSheet.Range("A7:C" & eR).WrapText = True
' Neu thay khong dep thì chay 3 dòng lenh duoi, toc do se rat cham
For i = 7 To eR
ActiveSheet.Rows(i).RowHeight = ActiveSheet.Rows(i).RowHeight + 5.5
Next i
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Code này chạy được nhưng khi chạy thêm 3 dòng dưới tốc độ chậm quá, bạn và mọi người cải thiện tốc độ lại với;
Nhờ mọi người tạm sửa cho code trên chỉ áp dụng cho sheet hiện hành thôi, Do cấu trúc của các Sheet có thể khác nhau
Em đã sửa chỉ cho áp dụng cho sheet hiện hành nhưng vẫn chậm
Sub GPE()
Dim i As Long, eR As Long
Application.ScreenUpdating = False
eR = ActiveSheet.Range("C65500").End(xlUp).Row
ActiveSheet.Rows("7:" & eR).EntireRow.AutoFit
ActiveSheet.Range("A7:C" & eR).VerticalAlignment = xlCenter
ActiveSheet.Range("A7:C" & eR).WrapText = True
' Neu thay khong dep thì chay 3 dòng lenh duoi, toc do se rat cham
For i = 7 To eR
ActiveSheet.Rows(i).RowHeight = ActiveSheet.Rows(i).RowHeight + 5.5
Next i
Application.ScreenUpdating = True
End Sub
Có file thực mới có cách xử lý phù hợp
 
Upvote 0
Em thử chạy code cho 1 sheet đầu mất khoảng 5 phút. Anh xem có cách nào tối ưu code giúp em với
code gốc, máy mình chạy 0.4 giây
Code mới nhanh hơn (hên xui)
Mã:
Sub GPE()
  Dim i As Long, eR As Long, Rng As Range, S As Variant, iKey

  Application.ScreenUpdating = False
  Application.Calculation = xlManual
  eR = ActiveSheet.Range("C65500").End(xlUp).Row
  ActiveSheet.Range("A6:C" & eR).WrapText = True
  ActiveSheet.Rows("6:" & eR).EntireRow.AutoFit
  ActiveSheet.Range("A6:C" & eR).VerticalAlignment = xlCenter   

  With CreateObject("scripting.dictionary")
    For i = 6 To eR
      iKey = ActiveSheet.Rows(i).RowHeight + 8.5
      If .exists(iKey) = False Then
        .Add iKey, Array(i)
      Else
        S = .Item(iKey)
        ReDim Preserve S(UBound(S)+1)
        S(UBound(S)) = i
        .Item(iKey) = S
      End If
    Next i
    For Each iKey In .keys
      S = .Item(iKey)
      For i = 0 To UBound(S)
        If Rng Is Nothing Then
          Set Rng = ActiveSheet.Range("A" & S(i))
        Else
          Set Rng = Union(Rng, ActiveSheet.Range("A" & S(i)))
        End If
      Next i
      Rng.RowHeight = iKey
      Set Rng = Nothing
    Next
  End With
  Application.Calculation = xlAutomatic
  Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
code gốc, máy mình chạy 0.4 giây
Code mới nhanh hơn (hên xui)
Mã:
Sub GPE()
  Dim i As Long, eR As Long, Rng As Range, S As Variant, iKey

  Application.ScreenUpdating = False
  Application.Calculation = xlManual
  eR = ActiveSheet.Range("C65500").End(xlUp).Row
  ActiveSheet.Range("A6:C" & eR).WrapText = True
  ActiveSheet.Rows("6:" & eR).EntireRow.AutoFit
  ActiveSheet.Range("A6:C" & eR).VerticalAlignment = xlCenter  

  With CreateObject("scripting.dictionary")
    For i = 6 To eR
      iKey = ActiveSheet.Rows(i).RowHeight + 8.5
      If .exists(iKey) = False Then
        .Add iKey, Array(i)
      Else
        S = .Item(iKey)
        ReDim Preserve S(UBound(S)+1)
        S(UBound(S)) = i
        .Item(iKey) = S
      End If
    Next i
    For Each iKey In .keys
      S = .Item(iKey)
      For i = 0 To UBound(S)
        If Rng Is Nothing Then
          Set Rng = ActiveSheet.Range("A" & S(i))
        Else
          Set Rng = Union(Rng, ActiveSheet.Range("A" & S(i)))
        End If
      Next i
      Rng.RowHeight = iKey
      Set Rng = Nothing
    Next
  End With
  Application.Calculation = xlAutomatic
  Application.ScreenUpdating = True
End Sub
Máy anh khỏe quá, 0.4 giây đã xong
Chạy code sau nhanh hơn. Hôm tới anh em gặp nhau nhé. Đầu tháng 7 nhé
 
Upvote 0
Em thử chạy code cho 1 sheet đầu mất khoảng 5 phút. Anh xem có cách nào tối ưu code giúp em với
Tôi giúp bạn tối ưu Code, Cách viết code thao tác trực tiếp Worksheet là không nên

Code của bạn sau khi tối ưu tôi Run cũng chỉ mất 0.5(s)

Lưu ý: Application.ScreenUpdating sẽ không phù hợp với trường hợp Ứng dụng của bạn chạy Runtime nhé.
Thay vào đó hãy sử dụng DoEvents

JavaScript:
Sub GPE()
'DoEvents
  Dim T As Double: T = Timer
  Application.ScreenUpdating = False
  Dim i&, eR&, Rng As Range
  With ThisWorkbook.Worksheets(1)
    eR = .Cells(Rows.Count, 3).End(xlUp).Row
    Set Rng = .Range("A6:C" & eR)
    With Rng
      .EntireRow.AutoFit
      .VerticalAlignment = xlCenter
      .WrapText = True
    End With
    For i = 6 To eR
      .Rows(i).RowHeight = .Rows(i).RowHeight + 8.5
    Next i
  End With
  Application.ScreenUpdating = True
  Debug.Print Round(Timer - T, 2)
  Set Rng = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom