vba迭代具有公式和填充的列

时间:2014-06-23 13:58:05

标签: excel-vba vba excel

我有一张定期导入的数据表,长度也随之改变。

所以,我想编写一些VBA代码,删除任何额外的行,并将任何公式自动填充到最后一行。

我完成了第一部分。此代码查找最后一行,并删除其下面的任何内容。

Sub CleanData()
    Dim lastrow As Long
    Sheets("Open Operations").Select
    Range(Cells(Rows.Count, 1).End(xlUp).Offset(1), _
      Cells(Rows.Count, 1)).EntireRow.Delete
    lastrow = ActiveSheet.UsedRange.Rows.Count

End Sub

我坚持的部分是,我不确定如何自动填充任何需要它的列。这些列可能正在改变,所以我希望我的代码能够处理这个。所以,我想迭代第一行中的所有单元格,从第一列到最后一列使用。然后,如果该单元格是公式,我想将公式填充到lastrow,如第一个代码块中所定义。

这是我到目前为止所拥有的:

Dim lastcolumn As Long

lastcolumn = ws.Cells(1, Columns.Count).End(xlToLeft).Column

For Each c In ActiveSheet.Range("A1:A" & lastcolumn).Cells

    If c.HasFormula = True Then

但我对VBA很陌生,而且我不确定如何将列填充到之前定义的Last Row。

编辑:澄清 - 我想迭代每列中的每个第一个单元格,直到最后一列。然后,如果该单元格包含公式,我想将整列自动填充/填充到第一个代码块中定义的lastrow。

感谢。

2 个答案:

答案 0 :(得分:2)

我设法创建了完成上述任务的代码:

以下是感兴趣的人的代码:

Sub CleanData()

' Clean the data
    Application.Calculation = xlManual

    Call CleanSheet("Order Headers")
    Call CleanSheet("Open Operations")
    Call CleanSheet("Confirmations (SAP)")
    Call CleanSheet("VA05")
    Call CleanSheet("ZOOP")
    Call CleanSheet("PremExped")

    Application.Calculation = xlCalculationAutomatic


End Sub

Sub CleanSheet(SheetName As String)

' Cleans the Sheet specified by SheetName

    ' Variable Declaration
    Dim NumColumns As Long
    Dim NumRows As Long
    Dim ColumnCounter As Long

    ' Find the number of rows and columns in SheetName
    NumRows = Sheets(SheetName).Cells(Rows.Count, 1).End(xlUp).Row
    NumColumns = Sheets(SheetName.Cells(1, Columns.Count).End(xlToLeft).Column

    ' Define the ranges for pulling down the formulas
    Set rng1 = Worksheets(SheetName).Range("A2:A" & NumRows)
    Set rng2 = Worksheets(SheetName).Range("A2")

    ' Delete extraneous rows of data
    Sheets(SheetName).Select
    Range(Cells(Rows.Count, 1).End(xlUp).Offset(1), _
      Cells(Rows.Count, 1)).EntireRow.Delete

    ' Ensure all formulas are dragged down appropriately
    For ColumnCounter = 0 To NumColumns
        If rng2.Offset(0, ColumnCounter).HasFormula = True Then
        rng1.Offset(0, ColumnCounter).FillDown
        End If
        Next ColumnCounter

End Sub

答案 1 :(得分:0)

("A1:A" & lColumn)似乎混淆了行和列。 我想你想要:

LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
or
LastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

编辑:也许只是以下内容:

For Each c In ActiveSheet.UsedRange