【问题标题】:vba iterate over columns with formulas and filldownvba用公式和填充遍历列
【发布时间】:2014-06-23 13:58:05
【问题描述】:

我有一个定期导入的数据表,长度会发生变化。

所以,我想编写一些 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

我坚持的部分是我不确定如何自动填充任何需要它的列。这些列可能会发生变化,所以我希望我的代码能够处理这个问题。所以,我想遍历第一行中的所有单元格,从第一列到最后一列。然后,如果该单元格是一个公式,我想将公式填充到最后一行,如第一个代码块中定义的那样。

这是我目前所拥有的:

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 很陌生,我不确定如何使列填充到之前定义的最后一行。

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

谢谢。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

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

    这里是任何感兴趣的人的代码:

    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
    

    【讨论】:

    • 快速建议。将此 Sub CleanSheet() 更改为 Sub CleanSheet(SheetName as String)。然后,您可以删除干净数据中的所有 SheetName 引用,并将您的调用从以下位置更改:Call CleanSheetCall CleanSheet("Order Headers") 等。这样可以防止在一个过程中对同一变量进行多次更改,并稍微清理一下。跨度>
    • @guitarthrower,感谢您的建议。我对 VBA 还是很陌生。我需要在代码前面声明变量 SheetName,还是在 Sub 标题中声明就足够了?
    • 好问题。因为它被声明为CleanSheet 的一部分,所以不需要在CleanData 中声明它。它变成了CleanSheet 的一个参数,就像一个范围是你给工作表上的SUM 公式提供的参数一样。
    • 谢谢。所做的更改。
    • 看起来不错。您应该接受您的回答,以便寻找类似问题的其他人知道您发布的代码对您有用。
    【解决方案2】:

    ("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
    

    【讨论】:

    • 我实际上认为那部分是正确的。我正在弄清楚最后一列是什么。然后,对于这些列中的每一列,如果该列包含一个公式,我想确保该公式向下延伸到最后一行(由第一个代码块中的 xlong 定义)。
    • @Austin Wismer - 我有一个事后的想法 - 见编辑
    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 2015-12-06
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2023-04-08
    • 2020-01-19
    相关资源
    最近更新 更多