Excel 动态合并&;使用VBA按可变值将单元格居中

Excel 动态合并&;使用VBA按可变值将单元格居中,excel,vba,Excel,Vba,我正在尝试使用VBA的静态起点合并&Centerx单元格数 我的起点始终是单元格D69,我将始终从第69行开始合并列D-I,然后将文本向左对齐 我的当前宏如下所示: Range("D69:I69").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .Orientation = 0

我正在尝试使用VBA的静态起点合并&Center
x
单元格数

我的起点始终是单元格D69,我将始终从第69行开始合并列
D-I
,然后将文本向左对齐

我的当前宏如下所示:

Range("D69:I69").Select
        With Selection
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlBottom
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
        Selection.merge
        With Selection
            .HorizontalAlignment = xlLeft
            .VerticalAlignment = xlBottom
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = True
        End With
我需要对第69行之后的行继续此过程
x
次数。我很难实现一个循环,它使用
x
作为我的迭代次数,并且起点是第69行+迭代次数作为行参考点

  • 确定最后一行
  • 循环通过从
    D合并到I的每一行(从69开始)
  • 循环完成后,立即格式化整个范围
  • 这也会检查以确保您的最后一行确实大于69,否则这将给出一个错误


    选项显式
    _客户端()的子合并_
    将ws设置为工作表:设置ws=ThisWorkbook.Sheets(“Sheet1”)’=69,然后
    对于i=69至LR
    ws.Range(ws.Cells(i,“D”)、ws.Cells(i,“i”)).Merge
    接下来我
    使用ws.Range(ws.Cells(69,“D”)、ws.Cells(LR,“I”))
    .HorizontalAlignment=xlLeft
    '添加要在此With块中应用的任何其他格式
    以
    如果结束
    Application.DisplayAlerts=True
    Application.ScreenUpdating=True
    端接头
    
    查看这是否有帮助,更多详细信息请参见代码注释:

    子合并此()
    将ws设置为工作表:Set ws=ThisWorkbook.Sheets(“SheetName”)'声明并设置工作表,设置工作表名称。
    Dim X As Long,howManyTimes As Long'声明要使用的变量
    howManyTimes=100'在此处设置次数。请参阅其他代码,了解如何将其移到最后一行
    对于X=0到howManyTimes的循环,从0到如此多次
    使用ws.Range(“D69:I69”).Offset(X)使用Offset from Range来获得要处理的新范围
    .MergeCells=True
    .HorizontalAlignment=xlLeft
    以
    下一个X
    端接头
    
    我已经从merge/format中删除了所有默认值,如果它们没有设置为不同的值,则没有任何区别

    现在有很多方法可以得到最后一行,如果你需要的话。只需添加:

    Dim lRow As Long:lRow=ws.Cells(Rows.Count,4).End(xlUp).Row
    howManyTimes=lRow
    
    我会停下来问问自己是否真的需要合并这些单元格?有时这会增加价值,但这往往是一个糟糕设计的标志。这里的弊大于利。在VBA和excel公式中使用合并单元格是一件痛苦的事情。我完全同意“糟糕的设计”这个问题。这是最明确的情况,但它也是来自客户的文档,他们希望保持设计不变。
    Option Explicit
    
    Sub Merge_For_Client()
    
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1") '<-- Update Sheet
    Dim LR As Long, i As Long
    
    LR = ws.Range("D" & ws.Rows.Count).End(xlUp).Row
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
        If LR >= 69 Then
    
            For i = 69 To LR
                ws.Range(ws.Cells(i, "D"), ws.Cells(i, "I")).Merge
            Next i
    
            With ws.Range(ws.Cells(69, "D"), ws.Cells(LR, "I"))
                .HorizontalAlignment = xlLeft
                'Add any other formats you want to apply in this With Block
            End With
    
        End If
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    
    End Sub