【问题标题】:VBA loop merging cells in specific rangeVBA循环合并特定范围内的单元格
【发布时间】:2018-09-12 19:25:15
【问题描述】:

我有一个指定的范围,想要合并每行的单元格 A-D。我不确定哪个循环是最好的,并且搞砸了不同的循环,我遇到的问题是对象定义的错误或将整个范围合并到一个单元格中。

Sub Merge()

Dim EndRangeRE As Range
Dim EndRangeNRE As Range
Dim rngall As Range
Dim StartRangeNRE As Range
Dim StartRangeRE As Range
Dim looprng As Range

Sheets("{Activity} 7300-1input template").Activate
Set rngall = Sheets("{Activity} 7300-1input template").UsedRange
Set EndRangeRE = rngall.Find(What:="10. Other Costs", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
Set EndRangeNRE = rngall.Find(What:="Recurring Costs", LookIn:=xlValues,LookAt:=xlWhole, MatchCase:=True)
Set StartRangeNRE = rngall.Find(What:="Non-Recurring Costs",LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
Set StartRangeRE = rngall.Find(What:="Recurring Costs", LookIn:=xlValues,LookAt:=xlWhole, MatchCase:=True)
Set looprng = Sheets("{Activity} 7300-1input template").Range(StartRangeNRE, EndRangeRE)

For Each Row In looprng
    Cells(0, 4).Merge
Next Row

End Sub

这给了我一个错误,我不确定如何指定每一行、A:D 合并和下一行。它会是一个do循环吗?我对实现这一目标的最简单方法持开放态度,因此很高兴提出建议(我在编码方面没有太多经验,所以有什么可以帮助我学习的!)。谢谢!

【问题讨论】:

    标签: vba excel loops merge


    【解决方案1】:

    也许你在追求这个:

    Option Explicit
    
    Sub Merge()
        Dim EndRangeRE As Range, StartRangeNRE As Range
        Dim myRow As Range
    
        With Sheets("{Activity} 7300-1input template")
            With .UsedRange
                Set EndRangeRE = .Find(What:="10. Other Costs", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
                Set StartRangeNRE = .Find(What:="Non-Recurring Costs", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
            End With
    
            For Each myRow In .Range(StartRangeNRE, EndRangeRE).Rows
                .Rows(myRow.row).Resize(, 4).Merge
            Next
        End With
    End Sub
    

    我摆脱了未使用的变量并使用一些With-End With 块来引用同一对象的多个引用

    【讨论】:

      【解决方案2】:

      这会将 AD 合并为 100 行:

      Sub ytrewq()
          For i = 1 To 100
              Range("A" & i & ":D" & i).MergeCells = True
          Next i
      End Sub
      

      编辑#1:

      Sub ytrewq()
          For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
              Range("A" & i & ":D" & i).MergeCells = True
          Next i
      End Sub
      

      【讨论】:

      • 谢谢!所以范围是动态的。会添加一些东西,因此范围会有所不同。我可以使用范围作为“looprng”变量吗?或者我是否需要创建一个新变量来计算范围内的行数并在上面的示例中设置为“100”?
      • @AGB04 见我的EDIT#1
      • 我想你这次可能错过了目的,他正在寻找合并 2xFind 之间的单元格,以合并 "Non-Recurring Costs""10. Other Costs" 之间的所有单元格
      【解决方案3】:

      试试这个代码:

       Sub test()
              'Get The Last non empty row
              lastRow = ThisWorkbook.Sheets("YourSheetName").Cells(Rows.Count, 1).End(xlUp).Row
      
              For i = 1 To lastRow
                  ThisWorkbook.Sheets("YourSheetName").Range("A" & i & ":D" & i).Merge
              Next i
      
       End Sub
      

      【讨论】:

      • 非常感谢!
      【解决方案4】:

      下面的代码合并了looprng 范围内“A:D”列中的单元格。

      代码

      Option Explicit
      
      Sub Merge()
      
      Dim EndRangeRE As Range
      Dim EndRangeNRE As Range
      Dim rngall As Range
      Dim StartRangeNRE As Range
      Dim StartRangeRE As Range
      Dim looprng As Range
      ' 2 added object variables      
      Dim Sht As Worksheet
      Dim myRow As Range   
      
      ' set your worksheet object, don't need to Activate it
      Set Sht = ThisWorkbook.Sheets("{Activity} 7300-1input template")    
      Set rngall = Sht.UsedRange
      
      Set EndRangeRE = rngall.Find(What:="10. Other Costs", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
      Set EndRangeNRE = rngall.Find(What:="Recurring Costs", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
      Set StartRangeNRE = rngall.Find(What:="Non-Recurring Costs", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
      Set StartRangeRE = rngall.Find(What:="Recurring Costs", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
      
      Set looprng = Sht.Range(StartRangeNRE, EndRangeRE)
      
      ' merge cells in columns "A:D" in your range
      For Each myRow In looprng.Rows
          Sht.Range(Sht.Range("A" & myRow.Row), Sht.Range("D" & myRow.Row)).Merge
      Next myRow
      
      End Sub
      

      【讨论】:

      • 谢谢!感谢您的帮助!
      • @AGB04 不客气 :) 是否按预期工作?
      猜你喜欢
      • 2018-05-11
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 2018-06-30
      相关资源
      最近更新 更多