週日,08 2017十月
  0 回复
  3.2K訪問
0
投票
復原
我的工作簿中有一個工作表,包含 400 多行、8 列和 160 個合併範圍,但我弄亂了它的外觀。 我在網路上搜尋了 VBA Autofit Merged Cells。 這些 URL 都沒有太大用處。 該網站上的巨集處於正確的軌道上,但是:-
1) 我必須手動識別並輸入 160 個合併範圍。
我新增了對合併儲存格範圍的搜尋。
2)它使用第一行進行合併儲存格計算(儲存格ZZ1)。 我在儲存格 A1(標題)上使用了更大的字體,這會導致計算所需的合併自動調整高度時出錯。
我使用資料右側 1 列和下方 1 行的儲存格。 (Ctrl+Shift+End,沒有找到該儲存格)
3)它重新計算所有合併單元格,因此減少了包含合併單元格和正常單元格的兩行的高度,從而使正常單元格不可讀。
只有當所需的合併高度超過現有高度時,我才更改行高。
4)將合併區域中的資料複製到單元格ZZ1的方法不正確,僅基於合併區域中的文本,而不考慮各個合併單元格中不同的字體大小。
我糾正了複製方法。
5) 巨集很慢:在我的工作表上大約 15 秒以上。
關閉螢幕重新整理並在巨集結束時重新打開,可將時間縮短至 2 秒。

我設法發現了另一個令人惱火的錯誤。 自動調整工作表(在修正合併範圍之前),它會扭曲幾行。 有些設定為換行的「正常」儲存格的高度增加,並顯示為一行(或兩行)文本,文字下方有一個空白行。 Internet 搜尋表示這是由 Excel 變更顯示以適應印表機字體所引起的。 找到了一個“解決方法”,我添加到巨集中:
將列寬增加一小部分。
自動調整工作表上的所有行。
對行高進行更正以適應合併的範圍。
將列寬恢復為原始大小。
這解決了問題,現在不再出現空白行!

以為現在一切都正確了,但隨後我發現了進一步的問題。 如果我關閉工作簿並再次重新開啟它,空白行會再次出現。 查看文件/選項,我在網路上搜尋了一種防止工作簿在關閉/開啟工作簿時更新螢幕顯示的方法,但沒有成功。 我必須在「ThisWorkbook」標籤上新增 Private Sub Workbook_Open(),並在開啟工作簿時呼叫執行巨集。


Option Explicit

子 Look4Merged()
Dim WSN As String '工作表名稱
Dim sht As 工作表「由「Set」使用
Dim LastRow As Long '所有包含資料的欄位中的最後一行
Dim LastRowCC As Long '目前列中包含資料的最後一行
Dim LastColumn As Integer '包含資料的所有行中最後一列的數量
Dim CurrCol As Integer '目前列數
Dim Letter As String '將 CurrCol 數字轉換為字串
Dim ILetter As String '最後一列右側的索引列一
Dim ICell As String 'Cell 右一列與下一行 frpm 資料區。 用於計算所需的合併高度
Dim CRow As Long '目前行號
Dim TwN As Long '錯誤處理
Dim TwD As String '錯誤處理
Dim Mgd As Boolean 'True/False 測試儲存格是否合併
Dim MgdCellAddr As String '包含合併範圍作為字串
Dim MgdCellStart As String '合併儲存格範圍的起始字母 例如使用檢查 B 列中的合併儲存格,忽略從 A 列開始延伸至 B 列的任何合併儲存格(已評估)
Dim MgdCellStart1 As String '用於計算 MgdCellStart
Dim MgdCellStart2 As String '用於計算 MgdCellStart
Dim OldHeight As Single '合併範圍內所有行的現有高度
Dim P1 As Integer '循環計數/指針
Dim OldWidth As Single '合併範圍內單元格的現有寬度
Dim NewHeight As Single '合併範圍內所有行所需的高度。 若超出 OldHeight,則按比例更新各行
Dim C1 As Integer '循環列數
Dim R1 As Long '循環行計數/指針
Dim Tweak As Single '小幅增加列寬以克服空白行問題
暗橙色作為範圍
出錯時轉到 TomsHandler

Application.ScreenUpdating = False '如果螢幕更新僅關閉 15 秒,則快得多 2 秒。
Tweak = 1.04 '在自動調整所有行之前將列寬增加 4%。
WSN = ActiveSheet.名稱
列(“A:A”).EntireRow.Hidden = False

'尋找整個工作表中包含資料的最後一個活動行和列
使用 ActiveSheet.UsedRange
LastColumn = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
SearchOrder:=xlByColumns、SearchDirection:=xlPrevious).Column
LastRow = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
結束
CurrCol = LastColumn + 1 '即最後一列的右側
如果 CurrCol < 27 則
ILetter = Chr$(CurrCol + 64) '索引列
其他
ILetter = Chr$(Int((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) '如果是兩位數則為索引列。不關心三個字母
如果結束

'Icell 位於資料的右側和下方。 單元格用於計算適合合併範圍所需的高度
ICell = ILetter & LastRow + 1

'稍微增加列寬以解決空白行換行錯誤。
範圍(“A”&LastRow + 1).選擇
對於 C1 = 1 到最後一列
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Tweak '少量增加列寬以修復錯誤
ActiveCell.Offset(0, 1).Range("A1").Select ' 向右移動一個儲存格
下一頁

'自動調整行(忽略合併行),列寬額外增加 4%,以防止某些換行行上出現空白行錯誤
單元格選擇
選擇.行.自動調整
設定 sht = Worksheets(WSN) '需要找到包含資料的欄位中的最後一個條目

對於 CurrCol = 1 到 LastColumn
'將目前列號轉換為 alpha (單字母或雙字母)
如果 CurrCol < 27 則
字母 = Chr$(CurrCol + 64)
其他
字母 = Chr$(Int((CurrCol - 1) / 26) + 64)
字母 = 字母 & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64)
如果結束
LastRowCC = sht.Cells(sht.Rows.Count, Letter).End(xlUp).Row '找出目前列的最後一行

對於 CRow = 1 到 LastRowCC
範圍(字母和CRow).選擇
Mgd = ActiveCell.MergeCells '儲存格是否在合併範圍內
如果 Mgd = True 那麼 '如果 True,那麼它是
'合併後的範圍位址是? 提取一位/兩位數作為範圍的開始
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Mid(MgdCellAddr, 2, 1)
MgdCellStart2 = Mid(MgdCellAddr, 3, 1)
如果 MgdCellStart2 = "$" 那麼
MgdCellStart = MgdCellStart1
其他
MgdCellStart = MgdCellStart1 & MgdCellStart2
如果結束
If MgdCellStart = Letter then '合併儲存格第一列等於目前列
帶床單(WSN)
舊寬度 = 0
Set oRange = Range(MgdCellAddr) '將 oRange 設定為偵測到的合併範圍
對於 C1 = 1 到 oRange.Columns.Count
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth '累積單元格範圍的列寬(新增 4%)
下一頁
舊高度 = 0
對於 R1 = 1 到 oRange.Rows.Count
OldHeight = OldHeight + .Cells(CRow, oRange.Row + R1 - 1).RowHeight '累積單元格範圍的現有行高
下一頁
oRange.MergeCells = 假
.Range(Letter & CRow).Copy Destination:=Range(ICell) '複製文字和字體大小,而不僅僅是值
.Range(ICell).WrapText = True '換行 ICell
.Columns(ILetter).ColumnWidth = OldWidth '更改包含 ICell 的列的寬度以模擬現有範圍
.Rows(LastRow + 1).EntireRow.AutoFit '自動調整ICell行,準備測量所需的合併高度
oRange.MergeCells = True '將合併範圍重設回合併狀態
oRange.WrapText = True '並換行
'測量合併範圍所需的高度
新高度 = .Rows(LastRow + 1).RowHeight
'新的要求高度是否超過舊的現有高度
如果新高度 > 舊高度則
對於 R1 = CRow 到 CRow + oRange.Rows.Count - 1
'按比例增加範圍內的每一行
範圍(ILetter & R1).RowHeight = 範圍(ILetter & R1).RowHeight * 新高度 / 舊高度
下一頁
其他
'合併儲存格中有足夠的空間
如果結束
CRow = CRow + oRange.Rows.Count - 1 '否則在多行範圍內,將下降到範圍的第二行並在到達“下一個”時重複計算
.Range(ICell).Clear 'Zap ICell 準備好進行下一次計算
.Range(ICell).ColumnWidth = 8.1 '整理列寬
結束
如果結束
如果結束
下一頁
下一頁

'重置列寬,刪除 4% 新增的內容(需要解決換行錯誤)
範圍(“A”&LastRow + 1).選擇
對於 C1 = 1 到最後一列
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak '將列寬減少到原始寬度
ActiveCell.Offset(0, 1).Range("A1").Select ' 向右一個儲存格
下一頁
範圍(“A1”)。選擇

Application.ScreenUpdating = True '重新開啟更新
退出小組

湯姆斯處理程序:
Application.ScreenUpdating = True '重新開啟更新
TwN = 錯誤編號
TwD = 錯誤描述
MsgBox "需要處理錯誤" & TwN & " " & TwD
停止
簡歷
END SUB

是否可以阻止 Excel 在關閉/重新開啟工作簿時更改螢幕顯示外觀?
有沒有為這個職位尚未作出回复。