我在网上搜索了很久,但找到的所有解决方案都是关于如何防止 Excel 调整已存在的表格或数据透视表中的单元格大小。我还在选项下的设置中搜索,但没有找到任何可以解决我的问题的设置。
我的具体问题是,我有一个工作表,我想在其中创建多个表格,按年份存储有关我的薪水的信息。我已经为第一年创建了第一个表格,并且已经调整了列的大小,以便于阅读数据。但是,当我选择我的新标题并单击格式化为表格,Excel 会调整所有列的大小以适合新文本。
我的一些标题不太适合列,但这个表格是供个人使用的,我希望标题有清晰的名称(尽管更长),以便以后更容易引用它们。所以我希望有人能解决这个问题。必须再次手动调整所有列的大小真的很烦人。
答案1
有两种方法可以实现这一点:
- 最简单的方法是创建一个空表第一的和然后按您想要的方式进行设置。
- 使用宏保存所选内容的列宽,将其格式化为表格,然后恢复列宽。可以设置宏以与快捷键或命令按钮配合使用,也可以将其添加到功能区。甚至可以让它拦截功能区工具
Format as Table
。
对于方法 2,将以下代码添加到标准模块:
'============================================================================================
' Module : <any standard module>
' Version : 0.1.0
' Part : 1 of 1
' References : N/A
' Source : https://superuser.com/a/1332155/763880
'============================================================================================
Option Explicit
Public Sub ToggleTable_NoResize()
Dim ¡ As Long
Const s_DefaultStyle As String = "TableStyleMedium9" ' Change this for a different default style
Dim asngColumnWidths() As Single
ReDim asngColumnWidths(1 To Selection.Columns.Count)
For ¡ = LBound(asngColumnWidths) To UBound(asngColumnWidths)
asngColumnWidths(¡) = Selection.Columns(¡).ColumnWidth
Next ¡
Application.ScreenUpdating = False
Dim loNewTable As ListObject
On Error Resume Next
Set loNewTable = ActiveSheet.ListObjects.Add(xlSrcRange, Selection, , xlYes)
On Error GoTo 0
If loNewTable Is Nothing Then
Dim loExistingTable As ListObject
On Error Resume Next
Set loExistingTable = Selection.ListObject
On Error GoTo 0
If Not loExistingTable Is Nothing Then
loExistingTable.Unlist
End If
Else
loNewTable.TableStyle = s_DefaultStyle
For ¡ = LBound(asngColumnWidths) To UBound(asngColumnWidths)
Selection.Columns(¡).ColumnWidth = asngColumnWidths(¡)
Next ¡
End If
Application.ScreenUpdating = True
End Sub
使用快捷键设置:
- 确保显示“开发人员”选项卡
- 按Alt+++ ;选择宏;按L;P并设置快捷键M
Options…
笔记:
可以在代码中指定的位置更改表格的默认样式。
作为附加功能,再次运行宏将把表格转换回正常的单元格范围。
答案2
如果像我的情况一样,这是一个不常见但令人烦恼的问题,那么您可以使用这个解决方法,它可以有效地缓存列宽。我认为这符合该宏的精神,但没有宏。
- 制作临时副本:Ctrl+ A, Ctrl+ C, Ctrl+ N, Ctrl+ Home, Ctrl+ V。
- 创建表格,或执行任何其他导致 Excel 弄乱列宽的操作。
- 仅 恢复宽度:Alt+ Tab, Ctrl+ A, Ctrl+ C, Alt+ Tab, Ctrl+ Home, Ctrl+ Alt+ V,,, 。 WEnterEnter
如果您要制作这个宏,建议:
- 在某些情况下,即使重复,Ctrl+也不会选择整个工作表。请改用: + 、 + + 。ACtrlHomeShiftCtrlEnd
- 为了避免复制您的数据(因为您可能会编辑错误的副本,或者因为它很敏感),请将第一个Ctrl+ V, 替换为:Ctrl+ Alt+ V, W, Enter。
答案3
所有荣誉归功于 robinCTS 所创建的原始 marco。
但是,这个宏有一些小问题。代码中有一个特殊字符“¡”(倒置的感叹号)。运行它时会抛出错误。我做了一些修改来修复它。
默认行为也发生了变化。它保留表格的当前格式/样式,并且不会应用任何格式/样式。
再次运行宏将把表转换回数据范围。
Option Explicit
'A slight modification of the code from https://superuser.com/a/1332155/763880
Public Sub ToggleTable_NoResize()
Dim var As Long
Const s_DefaultStyle As String = "" 'Change this if you want a different default style
Dim asngColumnWidths() As Single
ReDim asngColumnWidths(1 To Selection.Columns.Count)
For var = LBound(asngColumnWidths) To UBound(asngColumnWidths)
asngColumnWidths(var) = Selection.Columns(var).ColumnWidth
Next var
Application.ScreenUpdating = False
Dim loNewTable As ListObject
On Error Resume Next
Set loNewTable = ActiveSheet.ListObjects.Add(xlSrcRange, Selection, , xlYes)
On Error GoTo 0
If loNewTable Is Nothing Then
Dim loExistingTable As ListObject
On Error Resume Next
Set loExistingTable = Selection.ListObject
On Error GoTo 0
If Not loExistingTable Is Nothing Then
loExistingTable.Unlist
End If
Else
loNewTable.TableStyle = s_DefaultStyle
For var = LBound(asngColumnWidths) To UBound(asngColumnWidths)
Selection.Columns(var).ColumnWidth = asngColumnWidths(var)
Next var
End If
Application.ScreenUpdating = True
End Sub
答案4
转到表格工具 > 设计选择属性取消选中“调整列宽”单击确定