【问题标题】:Center across selection doesn't work on "smaller range" but only on "bigger range"选择中心不适用于“较小范围”,而仅适用于“较大范围”
【发布时间】:2018-10-23 16:18:59
【问题描述】:

希望你一切顺利。我正在联系 Stack Overflow 社区,因为我目前在 Excel 中使用 VBA 编程时遇到初学者问题。我确实在尝试缩短和协调我公司的 Excel 流程。

上下文
在其他命令中,我正在尝试将宏编程为跨选择居中(这可能非常有用,并且右键单击转到格式等很痛苦)。我在网上找到了代码,不知怎的,它在某种程度上有效。

问题
第 1 步
我选择了一些单元格。我运行宏(见下面的代码)。它以选择为中心。
第 2 步
我选择了更大范围的单元格。它仍然以选择为中心。
第 3 步
我选择较小范围的单元格。 它不会以选择为中心。它保留了在这组特定单元格上使用的最广泛范围。

到目前为止我已经尝试过什么
我尝试使用 Selection.ClearFormats 命令;没用(可能没用好)。

代码

Sub center_across_selection()
'
' center_across_selection Macro
'
' Touche de raccourci du clavier: Ctrl+Shift+M
'
    With Selection
      If .HorizontalAlignment = xlCenterAcrossSelection Then
            .HorizontalAlignment = xlGeneral
        'converts regular text to centered across selection
        Else
            Selection.HorizontalAlignment = xlCenterAcrossSelection
        End If
    End With
End Sub  

感谢您的帮助!

first_step

second_step

【问题讨论】:

  • “失败”范围的屏幕截图在这里很有用。
  • “第一步”和“第二步”有帮助吗?
  • 似乎每个单独的单元格都会获得“选择中心”对齐,如果您在紧挨着已经具有该设置的单元格旁边的单元格上设置该值(但可能没有内容),Excel 将自动扩展“选择”以包含其他单元格。
  • 感谢您的回复。那么有什么解决方案,因为清除单元格的格式对我不起作用?你能想出一个主意吗?

标签: excel vba


【解决方案1】:

似乎每个单独的单元格都将获得“选择中心”对齐方式,如果您将该值设置在紧挨已具有该设置(但没有内容)的单元格旁边的单元格上,Excel 将自动扩展“选择”包括那些其他单元格。

这里有一些代码将显示所选单元格下方的格式:

Sub center_across_selection()
    Dim c As Range
    With Selection
        'show alignment "before"
        For Each c In .Cells
            c.Offset(1, 0) = c.HorizontalAlignment
        Next c
        Debug.Print .HorizontalAlignment = xlCenterAcrossSelection
        If .HorizontalAlignment = xlCenterAcrossSelection Then
            .HorizontalAlignment = xlGeneral
        Else
            .HorizontalAlignment = xlCenterAcrossSelection
        End If
        'show alignment "after"
        For Each c In .Cells
            c.Offset(2, 0) = c.HorizontalAlignment
        Next c
    End With
End Sub

至于修复,您可以立即检查所选内容中最后一个单元格右侧的单元格 - 如果将其设置为“跨选区中心”,则将其设置为其他内容。

Sub center_across_selection2()
    Dim c As Range, rNext As Range
    With Selection
        If .HorizontalAlignment = xlCenterAcrossSelection Then
            .HorizontalAlignment = xlGeneral
        Else
            'check whether the next cell to the right has CAS and is empty
            Set rNext = .Cells(.Cells.Count).Offset(0, 1)
            If rNext.HorizontalAlignment = xlCenterAcrossSelection _
                                         And Len(rNext.Value) = 0 Then
                rNext.HorizontalAlignment = xlGeneral
            End If
            .HorizontalAlignment = xlCenterAcrossSelection
        End If
    End With
End Sub

【讨论】:

  • 这是 100% 正确的,它让我每次。如果您有一次 CAS,然后尝试手动缩小范围,您必须首先为整个选择分配一些其他对齐方式,然后您可以为较小的范围进行 CAS。
  • 非常感谢。正如您所指出的,您将如何检查左侧的单元格?对不起,这里是真正的初学者。我应该把你写的东西用偏移量(0,-1)拍下来吗?并称之为 rPrevious 例如?
  • 我刚刚测试过,我认为相邻的 CAS 格式不会“看起来”在左边,而只是在右边。右边的单元格是否有值确实很重要,所以我添加了一个检查。
【解决方案2】:

您还可以使用函数递归检查所选内容右侧的单元格:

Sub center_across_selection()
    With Selection
        If .Offset(0, 1).HorizontalAlignment = xlCenterAcrossSelection Then resetAlignment (.Offset(0, 1))

        If .HorizontalAlignment = xlCenterAcrossSelection Then
            .HorizontalAlignment = xlGeneral
        'converts regular text to centered across selection
        Else
            Selection.HorizontalAlignment = xlCenterAcrossSelection
        End If
    End With

End Sub


Function resetAlignment(rng As Range)
    rng.HorizontalAlignment = xlGeneral
    If rng.Offset(0, 1).HorizontalAlignment = xlCenterAcrossSelection Then resetAlignment (rng.Offset(0, 1))
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多