合并单元格自动调整行高小工具【加载宏】
EXCEL单元格格式设置中的“自动调整行高”功能,对于合并单元格并不适合。
手动进行调整的话,可以用一个文本框的自动适合文字的设置,来得到合适的总高度,然后把这个总高度按合并单元格的行数进行均分,以此设置它们的行高。
但是,上述手动 操 作效率很低,如果表格中的合并单元格很多的话,那就会非常麻 烦。
在“以人为本”的思想为指导下,这种麻 烦 事,还是交给电脑来做吧!
附件使用方法:很简单的,
把附件中的宏工作薄用EXCEL打开,再另存为 加载宏 格式(后缀名为.xlam),保存在EXCEL默认的加载宏文件夹下,然后在“开发工具”选项卡上点“加载项”按钮,在弹出的对话框中,把“合并单元格自动行高”勾选上就可以了。
当你在合并单元格中编辑完成切换到其它单元格时,该程序就会自动运行。无论合并单元格字体的名称、大小是什么,它都能完成任务。
更新内容:
1、程序运行过程中,不再在当前的活动工作薄中添加、删除文本框和其它任何对象,以免影响到活动工作薄中的文本框命名。需要得到合并单元格最合适的行高时,直接使用预置于加载宏工作薄内的文本框,在对用户无任何打扰的情况下完成任务,做到“随风潜入夜,润物细无声”。
2、直接提供做好的加载宏。
模块1:
-
PrivateConst LOGPIXELSX =88
PrivateConst LOGPIXELSY =90
PrivateConst TWIPSPERINCH =1440
#If Win64 And VBA7 Then
PublicDeclarePtrSafeFunctionGetDCLib"user32"(ByVal hWnd AsLong)AsLong
PublicDeclarePtrSafeFunctionGetDeviceCapsLib"gdi32"(ByVal hDC AsLong,ByVal nIndex AsLong)AsLong
PublicDeclarePtrSafeFunctionReleaseDCLib"user32"(ByVal hWnd AsLong,ByVal hDC AsLong)AsLong
#Else
PublicDeclareFunctionGetDCLib"user32"(ByVal hWnd AsLong)AsLong
PublicDeclareFunctionGetDeviceCapsLib"gdi32"(ByVal hDC AsLong,ByVal nIndex AsLong)AsLong
PublicDeclareFunctionReleaseDCLib"user32"(ByVal hWnd AsLong,ByVal hDC AsLong)AsLong
#End If
Public DPI
Public myMergeAreaAddress AsString
Public myMergeAreaRowheights AsString
Public ht AsSingle
Public vtAlign AsExcel.Constants
PublicWrapTxtAsBoolean
PublicKeyOnAsBoolean
Function getDPI(bX AsBoolean)AsInteger'获取屏幕分辨率
Dim hDC As Long, RetVal As Long
hDC = GetDC(0)
If bX = True Then
getDPI = GetDeviceCaps(hDC, LOGPIXELSX)
Else
getDPI = GetDeviceCaps(hDC, LOGPIXELSY)
End If
RetVal = ReleaseDC(0, hDC)
End Function
Sub Undo_MergeAreaRowsAutofit()
With Range(myMergeAreaAddress)
.VerticalAlignment = vtAlign
rc = .Rows.Count
rh = Split(myMergeAreaRowheights, ",")
For i = 1 To rc
.Rows(i).RowHeight = rh(i)
Next
End With
Application.OnRepeat "恢复'合并单元格自动行高'操作", "Repeat_MergeAreaRowsAutofit"
End Sub
Sub Repeat_MergeAreaRowsAutofit()
With Range(myMergeAreaAddress)
.EntireRow.RowHeight = ht '根据平均高度设置行高
.VerticalAlignment= xlCenter '设置垂直方向居中对齐
.WrapText = True '设置自动换行
EndWith
Application.OnUndo"撤销'合并单元格自动行高'操作","Undo_MergeAreaRowsAutofit"
EndSub
Sub开关自动行高()
KeyOn=NotKeyOn
MsgBox"合并单元格自动行高功能已经"&IIf(KeyOn,"开启!","关闭!")
IfNotKeyOnThen
ThisWorkbook.Close
ElseIfIsEmpty(DPI)Then
DPI = getDPI(1)
EndIf
EndSub
ThisWorkbook模块:
-
PublicWithEventsExcelAppAsExcel.Application
Private tbx AsShape
PrivateSubExcelApp_SheetChange(ByValShAsObject,ByValTargetAsRange)
Dim sobj AsObject,RngAsRange
IfNotKeyOnThenExitSub
IfTarget.MergeCellsThen'如果是所选单元格为合并单元格
Set myMergeArea = Target.Cells(1).MergeArea '获取合并单元格所在区域
If myMergeArea.Cells(1)=""ThenExitSub'合并单元格为空时跳出过程
'保存合并单元格的位置、大小、及其字体的名字、大小
With myMergeArea
myMergeAreaAddress =.Address'获取合并单元格地址信息
vtAlign = .VerticalAlignment '设置合并单元格对齐方式为垂直居中对齐
wdth =.Next.Offset(,.Rows(1).Count).Left-.Left
Debug.Print myMergeAreaAddress
rc =.Rows.Count'获取合并单元格行数
myMergeAreaRowheights = ""
For i = 1 To rc
myMergeAreaRowheights = myMergeAreaRowheights & "," & .Rows(i).RowHeight '记录合并单元格每行“历史”行高
Next
SetRng=ThisWorkbook.Sheets(1).Range("A1")'设置当前工作簿的第一个工作表的 A1 单元格为 Rng 对象
cc = .Columns.Count '获取合并单元格列数
KeyOn=False
.CopyRng'将合并单元格内容临时存放于 Rng 中
KeyOn = True
Rng.UnMerge '设置Rng区域为非合并单元格
Rng.WrapText=True'设置 Rng 区域文本自动换行
For i = 1 To cc
cwd = cwd + .Cells(1, i).ColumnWidth '计算合并单元格区域字符数(每个单元格0-255)
wd = wd +.Cells(1, i).Width'计算合并单元格区域磅宽度(1磅 = 0.35毫米)
Next
Rng.ColumnWidth = cwd '将合并单元格字符数宽度赋值给Rng列宽
'计算 Rng 区域真实应为宽度
Do
ws = Rng.Width - wd '单元格之间默认线宽为0.375字符数
If ws >=0ThenExitDo
cwd = cwd - ws * DPI /72*0.127'72是每英寸的Point个数,0.127毫米是1英寸的1/200。(1英寸 = 25.4毫米 )
Rng.ColumnWidth = cwd
Loop
Rng.EntireRow.AutoFit '根据Rng列宽,通过自动换行获取行高
ht =(Rng.RowHeight+IIf(rc >5,5,2))/ rc '计算合并单元格平均高度
Repeat_MergeAreaRowsAutofit
End With
Application.OnUndo "撤销'合并单元格自动行高'操作", "Undo_MergeAreaRowsAutofit"
End If
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = True
'Application.AddIns(Split(ThisWorkbook.Name,".")(0)).Installed=False
EndSub
PrivateSubWorkbook_Open()
SetExcelApp=ThisWorkbook.Application
EndSub
-------------------------------------------------------------
合并单元格自动调整行高小工具【加载宏】 更新2018-1-4
https://club.excelhome.net/thread-1389572-1-1.html
(出处: ExcelHome技术论坛)
评论