VBA将公式添加到特定列并填充到最后一行
我正在尝试自动化我的月度报告,我终于开始使用VBA(通过复制我在网上看到的一堆东西,并尝试使它与我的项目一起工作) 我现在有一个宏在a、H、O等列中插入列,现在我想要另一个宏在每个列中插入a=连接公式,并用数据填充到最后一行(然后将这两个宏串在一起) 我目前有以下几点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) =
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