Chủ nhật, 08 Tháng 10 2017
  0 Trả lời
  3.1 nghìn lượt truy cập
0
Bình chọn
Undo
Tôi có một trang tính trong sổ làm việc chứa hơn 400 hàng, 8 cột và 160 phạm vi đã hợp nhất và tôi đã làm sai lệch diện mạo của nó. Tôi đã tìm kiếm trên internet cho VBA Autofit Merged Cells. Không có URL nào được sử dụng nhiều. Macro trên trang web này đang đi đúng hướng nhưng: -
1) Tôi phải xác định và nhập 160 phạm vi đã hợp nhất theo cách thủ công.
Tôi đã thêm tìm kiếm cho các phạm vi ô đã hợp nhất.
2) Nó sử dụng hàng một để thực hiện các phép tính ô đã hợp nhất (Ô ZZ1). Tôi sử dụng phông chữ lớn hơn nhiều trên ô A1 (Tiêu đề), dẫn đến lỗi khi tính toán chiều cao tự động lấy nét được hợp nhất bắt buộc.
Tôi sử dụng ô 1 cột bên phải và 1 hàng bên dưới dữ liệu. (Ctrl + Shift + End, không tìm thấy ô này)
3) Nó tính toán lại tất cả các ô đã hợp nhất, do đó nó làm giảm chiều cao của hai hàng chứa cả ô bình thường và hợp nhất làm cho các ô bình thường không thể đọc được.
Tôi chỉ thay đổi chiều cao hàng khi chiều cao hợp nhất được yêu cầu vượt quá chiều cao hiện có.
4) Phương pháp sao chép dữ liệu trong phạm vi hợp nhất sang ô ZZ1 không chính xác, chỉ dựa trên văn bản trong phạm vi được hợp nhất nhưng không tính đến các kích thước phông chữ khác nhau trong các ô được hợp nhất khác nhau.
Tôi đã sửa lại phương pháp sao chép.
5) Macro chậm: khoảng hơn 15 giây trên trang tính của tôi.
Tắt làm mới màn hình và bật lại ở cuối macro sẽ giảm thời gian này xuống còn 2 giây.

Tôi đã tìm ra một lỗi khó chịu khác. Tự động điều chỉnh trang tính (trước khi sửa các phạm vi đã hợp nhất) và nó làm sai lệch một số hàng. Một số ô “Bình thường”, được đặt thành được bao bọc, đã tăng chiều cao và xuất hiện dưới dạng một dòng (hoặc hai dòng) văn bản với một hàng trống bên dưới văn bản. Tìm kiếm trên Internet chỉ ra rằng nguyên nhân là do Excel thay đổi màn hình để phù hợp với phông chữ máy in. Tìm thấy một "công việc xung quanh", tôi đã thêm vào macro:
Tăng chiều rộng cột lên một tỷ lệ phần trăm nhỏ.
Tự động điều chỉnh tất cả các hàng trên trang tính.
Tiến hành chỉnh sửa chiều cao hàng để phù hợp với các phạm vi đã hợp nhất.
Hoàn nguyên chiều rộng cột về kích thước ban đầu.
Điều đó đã sửa nó, các hàng trống giờ đây không còn xuất hiện nữa!

Tôi nghĩ rằng tất cả bây giờ đều đúng nhưng sau đó tôi phát hiện ra một vấn đề khác. Nếu tôi đóng sổ làm việc và mở lại, các hàng trống sẽ quay trở lại. Nhìn vào Tệp / Tùy chọn và tôi đã tìm kiếm trên Internet để tìm phương pháp ngăn sổ làm việc cập nhật hiển thị màn hình khi đóng / mở sổ làm việc mà không thành công. Tôi đã phải thêm Private Sub Workbook_Open () trên tab “ThisWorkbook” với một lệnh gọi để chạy Macro khi sổ làm việc được mở.


Tùy chọn rõ ràng

Sub Look4Merged ()
Dim WSN as String 'Worksheet Name
Dim sht As Worksheet 'Được "Set" sử dụng
Làm mờ dòng LastRow As Long 'Hàng cuối cùng trong tất cả các cột có dữ liệu
Làm mờ LastRowCC As Long 'Hàng cuối cùng trong cột hiện tại có dữ liệu
Dim LastColumn As Integer 'Số cột cuối cùng trong tất cả các hàng có dữ liệu
Dim CurrCol As Integer 'Nummber của cột hiện tại
Dim Letter As String 'Chuyển đổi số CurrCol thành chuỗi
Dim ILetter As String 'Index cột một bên phải của cột cuối cùng
Dim ICell As String 'Ô bên phải một cột & một hàng xuống vùng dữ liệu frpm. Được sử dụng để tính toán chiều cao hợp nhất bắt buộc
Dim CRow As Long 'Số hàng hiện tại
Xử lý lỗi Dim TwN As Long '
Xử lý lỗi Dim TwD As String '
Dim Mgd As Boolean 'True / False kiểm tra nếu ô được hợp nhất
Dim MgdCellAddr As String 'Chứa dải ô hợp nhất dưới dạng một chuỗi
Dim MgdCellStart As String 'Chữ cái bắt đầu của dải ô đã hợp nhất Được sử dụng, ví dụ: kiểm tra Cột B để tìm các ô đã hợp nhất, bỏ qua bất kỳ ô nào đã hợp nhất bắt đầu từ Cột A kéo dài đến cột B (đã được đánh giá)
Dim MgdCellStart1 As String 'được sử dụng để tính MgdCellStart
Dim MgdCellStart2 As String 'được sử dụng để tính MgdCellStart
Dim OldHeight As Single 'Chiều cao hiện có của tất cả các hàng trong phạm vi hợp nhất
Dim P1 As Integer 'Số vòng lặp / con trỏ
Dim OldWidth As Single 'Chiều rộng hiện có của các ô trong phạm vi hợp nhất
Dim NewHeight As Single 'Chiều cao bắt buộc của tất cả các hàng trong phạm vi hợp nhất. Cập nhật các hàng riêng lẻ một cách tương ứng nếu nó vượt quá OldHeight
Dim C1 As Integer 'Loop Column count
Dim R1 As Long 'Số lượng hàng vòng lặp / con trỏ
Dim Tweak As Single 'Tăng nhỏ chiều rộng cột để khắc phục sự cố hàng trống
Dim oRange As Range
Lỗi GoTo TomsHandler

Application.ScreenUpdating = False 'Nhanh hơn NHIỀU 15 giây nếu màn hình được cập nhật chỉ 2 giây tắt.
Tweak = 1.04 'Tăng chiều rộng cột lên 4% trước khi Tự động điều chỉnh tất cả các hàng.
WSN = ActiveSheet.Name
Các cột ("A: A"). EntireRow.Hidden = False

'Tìm Hàng & Cột Hoạt động Cuối cùng trong toàn bộ Trang tính với Dữ liệu
Với ActiveSheet.UsedRange
LastColumn = Range (Range ("A1"), Cells (Rows.Count, Columns.Count)). Tìm (What: = "*", LookIn: = xlValues, _
SearchOrder: = xlByColumns, SearchDirection: = xlPrevious) .Column
LastRow = Range (Range ("A1"), Cells (Rows.Count, Columns.Count)). Tìm (What: = "*", LookIn: = xlValues, _
SearchOrder: = xlByRows, SearchDirection: = xlPrevious) .Row
Kết thúc với
CurrCol = LastColumn + 1 'tức là ở bên phải của cột cuối cùng
Nếu CurrCol <27 thì
ILetter = Chr $ (CurrCol + 64) 'Cột chỉ mục
Khác
ILetter = Chr $ (Int ((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr $ (CurrCol - Int ((CurrCol - 1) / 26) * 26 + 64) 'Cột chỉ mục nếu có chữ số đôi. Không bận tâm với chữ cái ba
Cuối Nếu

'Icell nằm ngay và bên dưới dữ liệu. Ô được sử dụng để tính toán chiều cao cần thiết để phù hợp với dải ô đã hợp nhất
ICell = ILetter & LastRow + 1

'Tăng chiều rộng cột lên một lượng nhỏ để chữa lỗi gói hàng trống.
Phạm vi ("A" & LastRow + 1). Chọn
Đối với C1 = 1 đến Cột cuối cùng
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Tinh chỉnh 'tăng chiều rộng cột lên một lượng nhỏ để chữa lỗi
ActiveCell.Offset (0, 1) .Range ("A1"). Chọn 'di chuyển sang phải một ô
Sau

'Tự động sắp xếp các hàng (bỏ qua các hàng đã hợp nhất) với chiều rộng cột tăng thêm 4% để ngăn lỗi hàng trống trên một số Hàng bao bọc
Ô.Chọn
Lựa chọn.Rows.AutoFit
Đặt sht = Worksheets (WSN) 'cần thiết để tìm Mục nhập cuối cùng trong cột có dữ liệu

Đối với CurrCol = 1 đến LastColumn
'chuyển đổi số cột hiện tại thành alpha (chữ cái đơn hoặc chữ đôi)
Nếu CurrCol <27 thì
Chữ cái = Chr $ (CurrCol + 64)
Khác
Chữ cái = Chr $ (Int ((CurrCol - 1) / 26) + 64)
Letter = Letter & Chr $ (CurrCol - Int ((CurrCol - 1) / 26) * 26 + 64)
Cuối Nếu
LastRowCC = sht.Cells (sht.Rows.Count, Letter) .End (xlUp) .Row 'tìm hàng cuối cùng trong cột hiện tại

Đối với CRow = 1 Đến LastRowCC
Phạm vi (Chữ cái & CRow). Chọn
Mgd = ActiveCell.MergeCells 'Là ô trong phạm vi hợp nhất
If Mgd = True Then 'Nếu Đúng, thì nó là
'Địa chỉ dải ô đã hợp nhất là gì? trích xuất chữ số đơn / đôi để bắt đầu dải ô
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Giữa (MgdCellAddr, 2, 1)
MgdCellStart2 = Giữa (MgdCellAddr, 3, 1)
Nếu MgdCellStart2 = "$" thì
MgdCellStart = MgdCellStart1
Khác
MgdCellStart = MgdCellStart1 & MgdCellStart2
Cuối Nếu
Nếu MgdCellStart = Chữ cái thì 'được Hợp nhất ô đầu tiên bằng cột hiện tại
Với Trang tính (WSN)
Chiều rộng cũ = 0
Đặt oRange = Phạm vi (MgdCellAddr) 'đặt oRange thành Phạm vi hợp nhất được phát hiện
Đối với C1 = 1 Đến oRange.Columns.Count
OldWidth = OldWidth + .Cells (1, oRange.Column + C1 - 1) .ColumnWidth 'Tích lũy độ rộng của cột cho phạm vi ô (với 4% được thêm vào)
Sau
Chiều cao cũ = 0
Đối với R1 = 1 Đến oRange.Rows.Count
OldHeight = OldHeight + .Cells (CRow, oRange.Row + R1 - 1) .RowHeight 'Tích lũy chiều cao hàng hiện có cho phạm vi ô
Sau
oRange.MergeCells = Sai
.Range (Letter & CRow) .Copy Destination: = Range (ICell) 'Sao chép văn bản VÀ kích thước phông chữ, không chỉ giá trị
.Range (ICell) .WrapText = True 'bọc ICell
.Columns (ILetter) .ColumnWidth = OldWidth 'thay đổi chiều rộng của cột chứa ICell để bắt chước phạm vi hiện có
.Rows (LastRow + 1) .EntireRow.AutoFit 'Tự động điều chỉnh hàng ICell, sẵn sàng đo chiều cao hợp nhất cần thiết
oRange.MergeCells = True 'Đặt lại Dải ô đã hợp nhất trở lại để hợp nhất
oRange.WrapText = True 'và gói
'Đo chiều cao cần thiết cho dải ô đã hợp nhất
NewHeight = .Rows (LastRow + 1) .RowHeight
'Chiều cao yêu cầu mới có vượt quá chiều cao hiện có cũ không
If NewHeight> OldHeight Then
Đối với R1 = CRow To CRow + oRange.Rows.Count - 1
'Tăng từng hàng theo tỷ lệ phạm vi
Phạm vi (ILetter & R1) .RowHeight = Phạm vi (ILetter & R1) .RowHeight * NewHeight / OldHeight
Sau
Khác
'đủ chỗ trong ô đã hợp nhất
Cuối Nếu
CRow = CRow + oRange.Rows.Count - 1 'khác trên phạm vi nhiều tệp, sẽ giảm xuống hàng thứ 2 của phạm vi và lặp lại phép tính khi đến "Tiếp theo"
.Range (ICell) .Clear 'Zap ICell đã sẵn sàng cho phép tính tiếp theo
.Range (ICell) .ColumnWidth = 8.1 'Chiều rộng cột gọn gàng
Kết thúc với
Cuối Nếu
Cuối Nếu
Sau
Sau

'Đặt lại chiều rộng cột loại bỏ 4% được thêm vào (cần thiết để chữa lỗi bọc)
Phạm vi ("A" & LastRow + 1). Chọn
Đối với C1 = 1 đến Cột cuối cùng
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak 'giảm chiều rộng cột về nguyên bản
ActiveCell.Offset (0, 1) .Range ("A1"). Chọn 'bên phải một ô
Sau
Phạm vi ("A1"). Chọn

Application.ScreenUpdating = True 'bật lại cập nhật
Thoát Sub

TomsHandler:
Application.ScreenUpdating = True 'bật lại cập nhật
TwN = Err.Số
TwD = Err.Mô tả
MsgBox "Cần xử lý lỗi" & TwN & "" & TwD
Dừng
Sơ yếu lý lịch
End Sub

Có thể ngăn Excel thay đổi giao diện hiển thị màn hình khi đóng / mở lại sổ làm việc không?
Không có câu trả lời cho bài viết này.