如何根据最小截止值动态删除数据

How to dynamically delete data based on a minimum cutoff value

我是路易斯安那州一家小型石油公司的地质学家。我组成了我们的技术部门,不幸的是我在编码方面的经验非常有限。我过去使用过非常基本的 vba 编码,但我在日常工作中编码不多,所以我忘记了大部分。我最近发现了这个网站,它已成为我的重要资源。我已经能够从以前对以前问题的回答中收集到一些代码片段,但我又一次被卡住了。

我正在开发一个从路易斯安那州 DNR 下载油井生产信息的宏,然后根据下载的数据计算某些值。到目前为止,我已经有了检索数据、对其排序并计算所需值的代码。

现在我需要能够 trim 这个数据。每口井的产油时间各不相同。目前我的宏将公式向下扩展到单元格 50(数据永远不会达到这一点。我选择它只是为了确保公式应用于所有单元格)。大多数计算值都是 0 我想创建一个宏来删除最后一个包含 1 或更大数字的单元格之后的所有值。

包含我要删除的数据的单元格在单元格 L

如果您还需要我提供任何其他信息,或者我没有解释我的问题,请告诉我 出色地。

这是我生成的用于计算单元格 L 中的数据的代码

Sub Oil_production_by_year()
'
' Oil_production_by_year Macro
'

'
Dim ws As Worksheet

    For Each ws In Sheets
        ws.Activate

    Range("L2").Select
    ActiveCell.FormulaR1C1 = _
        "=SUMIFS(RC[-8]:R[2998]C[-8],RC[-11]:R[2998]C[-11],"">=""&RC[8],RC[-11]:R[2998]C[-11],""<=""&RC[9])"
    Range("L2").Select
    ActiveWindow.ScrollColumn = 10
    ActiveWindow.ScrollColumn = 9
    ActiveWindow.ScrollColumn = 8
    ActiveWindow.ScrollColumn = 7
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.ScrollColumn = 5
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.SmallScroll Down:=-6
    Selection.AutoFill Destination:=Range("L2:L51"), Type:=xlFillDefault
    Range("L2:L51").Select
Next ws

End Sub

你好约西亚,祝你新年快乐。

此代码假设:

dataCol 是数据的参考列,用于确定自动填充 SUMIFS 公式的行数。目前它被设置为第 5 列(E 列),因此请更改它以适合您的数据。

trimVal 是一个变量,它保存单元格值将被删除的值。当前设置为 1。

删除公式单元格后,同一列中的任何数据'beneath'都将上移。

Option Explicit
Sub Oil_production_by_year() ' ' Oil_production_by_year Macro '
Dim ws As Worksheet
Dim stRow As Long, formulaCol As Long, c As Long
Dim dataCol As Long, dataEndRow As Long, trimVal As Long

stRow = 2
formulaCol = 12
trimVal = 1
'an assumption of colE for the data column
'change this to suit
'means that the formula will only fill the rows reqd
dataCol = 5

For Each ws In Sheets
    With ws
        dataEndRow = .Cells(Rows.Count, dataCol).End(xlUp).Row
        With ws.Cells(stRow, formulaCol)
            .FormulaR1C1 = _
                "=SUMIFS(RC[-8]:R[2998]C[-8],RC[-11]:R[2998]C[-11],"">=""&RC[8],RC[-11]:R[2998]C[-11],""<=""&RC[9])"
            .AutoFill Destination:=ws.Range(ws.Cells(stRow, formulaCol), ws.Cells(dataEndRow, formulaCol)), _
                    Type:=xlFillDefault
        End With

        For c = dataEndRow To stRow Step -1
            If .Cells(c, formulaCol).Value < trimVal Then
                .Cells(c, formulaCol).Delete xlShiftUp
            Else
                Exit For
            End If
        Next c
    End With
Next ws

End Sub 

仍然不知道您要删除哪种数据...我建议更改代码,如下所示:

Option Explicit

Sub Oil_production_by_year()
Dim wsh As Worksheet, iLastCell As Integer, r As Integer

For Each wsh In ThisWorkbook.Worksheets
    iLastCell = GetLastCell(wsh)
    wsh.Range("L2").FormulaR1C1 = "=SUMIFS(RC[-8]:R[2998]C[-8],RC[-11]:R[2998]C[-11],"">=""&RC[8],RC[-11]:R[2998]C[-11],""<=""&RC[9])"
    wsh.Range("L2").AutoFill Destination:=wsh.Range("L2:L" & iLastCell), Type:=xlFillDefault
    r = iLastCell
    Do While r > 2
        If wsh.Range("L" & r).Value = 0 Then
            'delete entire row
            wsh.Range("L" & r).EntireRow.Delete xlShiftUp
        End If
        If wsh.Range("L" & r).Value > 0 Then Exit Do End If
        r = r - 1
    Loop
Next

End Sub

Function GetLastCell(wsh As Worksheet, Optional sCol As String = "A")
    GetLastCell = wsh.Range(sCol & wsh.Rows.Count).End(xlUp).Row
End Function

根据您的需要更改代码 ;)