2015-01-01 52 views
0

我是一位在路易斯安那州的小型石油公司工作的地質學家。我構成了我們的技術部門,不幸的是我的編碼經驗非常有限。過去我使用過非常基本的vba編碼,但在日常工作中我沒有編寫太多的代碼,所以我已經忘記了大部分。我最近發現了這個網站,它已經成爲我的一個很好的資源。我已經能夠從以前對以前問題的回答中收集一些代碼,但我再次陷入困境。如何根據最小截斷值動態刪除數據

我正在研究一個從路易斯安那州的DNR狀態下載生產信息的宏,然後從這個下載的數據中計算出某些值。到目前爲止,我擁有檢索數據的代碼,對它進行排序,並計算出我需要的值。

現在我需要能夠修剪這些數據。每口井將有不同的時間生產石油。目前我的宏將公式擴展到單元格50(數據永遠不會達到這一點,我選擇它只是爲了確保公式適用於所有單元格)。大多數的計算值是0我想創建一個宏,刪除包含數字1或更大的最後一個單元格後的所有值。

包含我要刪除數據的單元格在蜂窩小區

請讓我還是知道是否有其他任何你需要我,如果我沒有解釋我的問題 好。

這裏是我所產生的蜂窩小區

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 
+0

如果你發佈你已有的東西,它會更容易幫助。例如,你的宏。如果您在運行之前測試了其中的數量,則無需將其限制在特定的範圍內。 – peege

+0

好的,我會發布它 –

+0

發佈虛擬數據以便更好地理解;) –

回答

1

你好約西亞和新年快樂給你計算數據的代碼。

此代碼假定:

dataCol是用於確定行自動填充您SUMIFS式的數量的數據的參照列中。目前它被設置爲第五列(col E),因此請將其更改爲適合您的數據。

trimVal是一個變量,它保存單元格值將被刪除的值。當前設置爲1.

當公式單元格被刪除時,它在同一列中的任何數據將被向上移動。

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 
+0

非常感謝!新年快樂! –

+0

@barryleajo,你一直比我快一點;)你的解決方案几乎與我的相同;) –

+0

@Maciej Los謝謝。我有一個可能對OP很重要的區別。我的代碼不會刪除整個行,只是'公式'列。我認爲任何原始數據都需要保留。 – barryleajo

0

還是不知道要刪除什麼樣的數據?我建議修改代碼,提供如下:

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 

更改代碼,以您的需求;)

+0

謝謝您的建議!新年快樂! –

+0

@JosiahHulsey,非常歡迎你,新年快樂!如果有幫助,你可以接受我的回答;) –