VBA将公式添加到特定列并填充到最后一行

VBA将公式添加到特定列并填充到最后一行,vba,excel,Vba,Excel,我正在尝试自动化我的月度报告,我终于开始使用VBA(通过复制我在网上看到的一堆东西,并尝试使它与我的项目一起工作) 我现在有一个宏在a、H、O等列中插入列,现在我想要另一个宏在每个列中插入a=连接公式,并用数据填充到最后一行(然后将这两个宏串在一起) 我目前有以下几点 Sub FillDown() Dim strFormulas(1 To 5) As Variant With ThisWorkbook.Worksheets("CommentsData") strFormulas(1) =

我正在尝试自动化我的月度报告,我终于开始使用VBA(通过复制我在网上看到的一堆东西,并尝试使它与我的项目一起工作)

我现在有一个宏在a、H、O等列中插入列,现在我想要另一个宏在每个列中插入a=连接公式,并用数据填充到最后一行(然后将这两个宏串在一起)

我目前有以下几点

Sub FillDown()
Dim strFormulas(1 To 5) As Variant
With ThisWorkbook.Worksheets("CommentsData")
    strFormulas(1) = "=CONCATENATE(B1,C1)"
    strFormulas(2) = "=CONCATENATE(I1,J1)"
    strFormulas(3) = "=CONCATENATE(P1,Q1)"
    strFormulas(4) = "=CONCATENATE(W1,X1)"
    strFormulas(5) = "=CONCATENATE(AD1,AE1)"
    .Range("A1,H1,O1,V1,AC1").Formula = strFormulas
    .Range("A1,H1,O1,V1,AC1").FillDown

    .Range("A:AG").NumberFormat = "General"
End With
End Sub
我得到了一个运行时1004“范围类的Filldown方法失败错误,范围行被突出显示。我假设我试图引用不并排的多个列的方式存在问题(无法在线找到此示例)

感谢您的帮助


接下来的问题:一旦我完成了这个工作,我想在工作簿中的其他工作表上也这样做,但它将是不同的列。我需要创建一个新的模块,还是可以在同一个模块中再次粘贴代码并更改范围/单元格引用?如果是,在这个特定示例中,我应该复制/粘贴哪个部分uld简化为:

Option Explicit

Public Sub FillDown1()
    Dim myColumns(), lastRow As Long, i As Long
    myColumns = Array("A", "H", "O", "V", "AC")

    With ThisWorkbook.Worksheets("CommentsData")
        lastRow = .Cells(.Rows.Count, "B").End(xlUp).row 'Change this to a column which you can use to determine how far to add formulas to

        For i = LBound(myColumns) To UBound(myColumns)
            .Range(.Cells(1, myColumns(i)), .Cells(lastRow, myColumns(i))).FormulaR1C1 = "=CONCATENATE(RC[1],RC[2])"
        Next i
        .Range("A:AG").NumberFormat = "General"
    End With
End Sub
离你更近的东西,但它看起来很丑吗

Public Sub FillDown2()
    Dim myColumns(), lastRow As Long, i As Long, myFormulas(1 To 5) As Variant
    myColumns = Array("A", "H", "O", "V", "AC")
    myFormulas(1) = ("B,C")
    myFormulas(2) = ("I,J")
    myFormulas(3) = ("P,Q")
    myFormulas(4) = ("W,X")
    myFormulas(5) = ("AD,AE")

    If UBound(myColumns) + 1 <> UBound(myFormulas) Then MsgBox "Array length for myColumns doesn't match myFormulas": Exit Sub

    With ThisWorkbook.Worksheets("CommentsData")
        lastRow = .Cells(.Rows.Count, "B").End(xlUp).row 'Change this to a column which you can use to determine how far to add formulas to
        For i = LBound(myColumns) To UBound(myColumns)
            .Cells(1, myColumns(i)).Formula = "=CONCATENATE(" & Split(myFormulas(i + 1), ",")(0) & 1 & "," & Split(myFormulas(i + 1), ",")(1) & 1 & ")"
            .Range(.Cells(1, myColumns(i)), .Cells(lastRow, myColumns(i))).FillDown
        Next i
        .Range("A:AG").NumberFormat = "General"
    End With
End Sub
公共子填充2()
Dim myColumns(),lastRow为Long,i为Long,myFormulas(1到5)为变体
myColumns=数组(“A”、“H”、“O”、“V”、“AC”)
My公式(1)=(“B,C”)
My公式(2)=(“I,J”)
My公式(3)=(“P,Q”)
My公式(4)=(“W,X”)
My公式(5)=(“AD,AE”)
如果UBound(myColumns)+1个UBound(myFormulas),则MsgBox“myColumns的数组长度与myFormulas不匹配”:退出Sub
使用此工作簿。工作表(“注释数据”)
lastRow=.Cells(.Rows.Count,“B”).End(xlUp).row'将其更改为一列,您可以使用该列确定向其中添加公式的距离
对于i=LBound(myColumns)到UBound(myColumns)
.Cells(1,myColumns(i)).Formula=“=CONCATENATE(&Split(myFormulas(i+1),”,”)(0)和1&“,&Split(myFormulas(i+1),”,”,”)和1&“)
.Range(.Cells(1,myColumns(i)),.Cells(lastRow,myColumns(i))).FillDown
接下来我
.Range(“A:AG”).NumberFormat=“General”
以
端接头
甚至可以将行(1)移回myFormulas数组

Public Sub FillDown2()
    Dim myColumns(), lastRow As Long, i As Long, myFormulas(1 To 5) As Variant
    myColumns = Array("A", "H", "O", "V", "AC")
    myFormulas(1) = ("B1,C1")   '<==========================shifted row back up into array
    myFormulas(2) = ("I1,J1")
    myFormulas(3) = ("P1,Q1")
    myFormulas(4) = ("W1,X1")
    myFormulas(5) = ("AD1,AE1")

    If UBound(myColumns) + 1 <> UBound(myFormulas) Then MsgBox "Array length for myColumns doesn't match myFormulas": Exit Sub

    With ThisWorkbook.Worksheets("CommentsData")
        lastRow = .Cells(.Rows.Count, "B").End(xlUp).row 'Change this to a column which you can use to determine how far to add formulas to
        For i = LBound(myColumns) To UBound(myColumns)
            .Cells(1, myColumns(i)).Formula = "=CONCATENATE(" & Split(myFormulas(i + 1), ",")(0) & "," & Split(myFormulas(i + 1), ",")(1) & ")"
            .Range(.Cells(1, myColumns(i)), .Cells(lastRow, myColumns(i))).FillDown
        Next i
        .Range("A:AG").NumberFormat = "General"
    End With
End Sub
公共子填充2()
Dim myColumns(),lastRow为Long,i为Long,myFormulas(1到5)为变体
myColumns=数组(“A”、“H”、“O”、“V”、“AC”)
myFormulas(1)=(“B1,C1”)”您可以尝试以下方法:

Sub FillDown()
    With ThisWorkbook.Worksheets("CommentsData")
        .Range("A:A,H:H,O:O,V:V,AC:AC").Offset(, 1).SpecialCells(xlCellTypeConstants).Offset(, -1).FormulaR1C1 = "=CONCATENATE(RC[1],RC[2])"
        .Range("A:AG").NumberFormat = "General"
    End With
End Sub
要将其扩展到更多工作表,请执行以下操作:

Sub FillDownMoreSheets()
    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets(Array("CommentsData", "CommentsData2", "CommentsData3"))
        With ws
            .Range("A:A,H:H,O:O,V:V,AC:AC").Offset(, 1).SpecialCells(xlCellTypeConstants).Offset(, -1).FormulaR1C1 = "=CONCATENATE(RC[1],RC[2])"
            .Range("A:AG").NumberFormat = "General"
        End With
    Next
End Sub

您应该避免使用保留字命名sub、函数和变量

FillDown
将隐藏内置的
Range.FillDown方法


这将适用于顶部常量中定义的所有图纸

WS\u RANGES
中的列表用空格分隔,并包含

  • SheetName范围列偏移量(
    CommentsData-A1:AG-7
  • ColumnOffset必须为3或更大(对于公式)


哇,当你试图让它看起来像我的时候,你没有错。谢谢你,我用了你最初的答案,它做得很好。我不太明白你在第三个选项中做了什么(对不起,我真的是新手,我不编码),但我感谢你的帮助。通过你的“扩展到更多工作表”“举例来说,我认为只有在所有工作表上的列和公式都相同的情况下,才有可能使用您的例子?@Tim,有任何反馈吗?谢谢您的帮助。我喜欢这个解决方案对noob友好的简化。不幸的是,每个工作表中需要插入/填充的特定列是不同的。@Tim,您可能知道,这可以通过两个数组轻松实现:一个用于工作表名称,另一个用于对应的列列表。如果你真的喜欢这个解决方案的简化,你仍然可以采用itThanks作为命名技巧!我将为我正在尝试做的其他事情节省一点您的代码。
Option Explicit

Public Sub JoinColumns()

 Const WS_RANGES = "CommentsData-A1:AG-7 CommentsData2-C2:AX-3"  'WSNames-Range-Offset

 Dim wsSet As Variant, ws As Worksheet, ur As Range, cls As Range, i As Variant, c As Long

 wsSet = Split(WS_RANGES)

 For Each ws In ThisWorkbook.Worksheets
   For Each i In wsSet
    i = Split(i, "-")

    If ws.Name = i(0) Then
     Set ur = ws.Range(i(1) & ws.Cells(ws.Rows.Count, Split(i(1),":")(1)).End(xlUp).Row)

     Set cls = ur.Columns(1)
     For c = i(2) + 1 To ur.Columns.Count Step i(2)
      Set cls = Union(cls, ur.Columns(c))
     Next
     cls.Formula = "=RC[1] & RC[2]"

     ur.NumberFormat = "General"
     Exit For
   End If
  Next
 Next
End Sub