首页 文章

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

提问于
浏览
1

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

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

  • 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
    
  • 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
    

相关问题