2013-06-04 41 views
0

我有可以簡化爲這種情況的數據來刪除行: http://i.imgur.com/mn5GgrQ.png創建Excel宏如果列值重複連續小於3倍

在本例中,我想刪除與軌道相關聯的數據2,因爲它只有3個相關的幀。所有超過3個關聯幀的數據都可以保留。

幀號並不總是從1開始,正如我試圖演示的那樣。跟蹤號碼將始終與跟蹤的幀數相同。我正在考慮使用函數爲列A中的每個連續值添加1,然後執行測試以查看該值是否等於> = 3.如果是,則轉到A中的下一個整數,如果否,然後刪除標有該整數的所有行(在本例中爲2)。

這是可能的Visual Basic在Excel宏中,任何人都可以給我一些啓動提示,我可能會使用哪些功能?完成新手在這裏。我還沒有發現任何類似的VBA,only for R.

回答

0

我假設你通過閱讀它來理解代碼。

Option Explicit 
Public Function GetCountOfRowsForEachTrack(ByVal sourceColumn As Range) As _ 
Scripting.Dictionary 
Dim cell As Range 
Dim trackValue As String 
Dim groupedData As Scripting.Dictionary 

Set groupedData = New Scripting.Dictionary 
For Each cell In sourceColumn 
    trackValue = cell.Value 

    If groupedData.Exists(trackValue) Then 
     groupedData(trackValue) = cell.Address(False, False) + "," + groupedData(trackValue) 
    Else 
     groupedData(trackValue) = cell.Address(False, False) 
    End If 
Next 

Set GetCountOfRowsForEachTrack = groupedData 
End Function 

Public Sub DeleteRowsWhereTrackLTE3() 
Dim groupedData As Scripting.Dictionary 
Set groupedData = GetCountOfRowsForEachTrack(Range("A2:A15")) 

Dim cellsToBeDeleted As String 
Dim item 
For Each item In groupedData.Items 
    If UBound(Split(item, ",")) <= 2 Then 
     cellsToBeDeleted = item + IIf(cellsToBeDeleted <> "", "," + cellsToBeDeleted, "") 
    End If 
Next 

Range(cellsToBeDeleted).EntireRow.Delete 
End Sub 

GetCountOfRowsForEachTrack是返回一個字典(存儲軌道數量與軌道的字符串相關聯的密鑰,單元格地址)

DeleteRowsWhereTrackLTE3是使用GetCountOfRowsForEachTrack獲得磁道號碼中的聚合信息的程序的功能和與之相關的細胞。此方法遍歷字典並檢查與軌道關聯的單元格的數量是否爲<=2(因爲拆分字符串會返回從0開始的數組)。它建立一個這樣的單元格的地址串,並在最後一次刪除它。

注:

  1. 添加BAS模塊在下面的代碼(或一個特定的片,其中 你有數據)。
  2. 添加對「Microsoft Scripting.Runtime」庫的引用。在VBA裏面,點擊「工具」 - >「參考」菜單。選中「Microsoft Scripting.Runtime」並單擊確定。
  3. 我以A2:A15爲例。請根據您的小區範圍進行修改。
  4. 假設是您沒有數千個要刪除的單元格,在這種情況下該方法可能會失敗。
  5. 致電DeleteRowsWhereTrackLTE3刪除此類行。