使用 Excel 创建表格时避免调整单元格大小

使用 Excel 创建表格时避免调整单元格大小

我在网上搜索了很久,但找到的所有解决方案都是关于如何防止 Excel 调整已存在的表格或数据透视表中的单元格大小。我还在选项下的设置中搜索,但没有找到任何可以解决我的问题的设置。

我的具体问题是,我有一个工作表,我想在其中创建多个表格,按年份存储有关我的薪水的信息。我已经为第一年创建了第一个表格,并且已经调整了列的大小,以便于阅读数据。但是,当我选择我的新标题并单击格式化为表格,Excel 会调整所有列的大小以适合新文本。

我的一些标题不太适合列,但这个表格是供个人使用的,我希望标题有清晰的名称(尽管更长),以便以后更容易引用它们。所以我希望有人能解决这个问题。必须再次手动调整所有列的大小真的很烦人。

答案1

有两种方法可以实现这一点:

  1. 最简单的方法是创建一个空表第一的然后按您想要的方式进行设置。
  2. 使用宏保存所选内容的列宽,将其格式化为表格,然后恢复列宽。可以设置宏以与快捷键或命令按钮配合使用,也可以将其添加到功能区。甚至可以让它拦截功能区工具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+++ ;选择宏;按LP并设置快捷键MOptions…

笔记:

可以在代码中指定的位置更改表格的默认样式。

作为附加功能,再次运行宏将把表格转换回正常的单元格范围。

答案2

如果像我的情况一样,这是一个不常见但令人烦恼的问题,那么您可以使用这个解决方法,它可以有效地缓存列宽。我认为这符合该宏的精神,但没有宏。

  1. 制作临时副本:Ctrl+ A,    Ctrl+ C,    Ctrl+ N,    Ctrl+ Home,    Ctrl+ V
  2. 创建表格,或执行任何其他导致 Excel 弄乱列宽的操作。
  3. 仅   恢复宽度:Alt+ Tab,    Ctrl+ A,    Ctrl+ C,    Alt+ Tab,    Ctrl+ Home,    Ctrl+ Alt+ V,,,    。   WEnterEnter

如果您要制作这个宏,建议:

  1. 在某些情况下,即使重复,Ctrl+也不会选择整个工作表。请改用: + 、    + + 。ACtrlHomeShiftCtrlEnd
  2. 为了避免复制您的数据(因为您可能会编辑错误的副本,或者因为它很敏感),请将第一个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

转到表格工具 > 设计选择属性取消选中“调整列宽”单击确定

相关内容