2014-02-25 63 views
0

好欄目,我是全新的,在這一點,與我懷疑是一個簡單的問題侮辱任何人都難過。然而,我已經搜索並嘗試了幾天的事情,無法破解堅果 - 我似乎無法完成所有我想要的事情。如何只顯示有一定的價值

這裏所說: 我對此每週更改值的工作表。行數和列數也會改變。但是,列A,B和C將始終具有日期,名稱和位置數據,因此必須保留。從D開始的列中的值僅包含數字0,1,2或3.

我需要將列複製到第二個工作表,然後刪除所有從D向前沒有的列2或3中。換句話說,如果在列的任何位置顯示2或3,我需要始終保留列A,B和C,並保留任何列(及其所有數據)。

或者,我敢打賭,它會更快櫻桃採摘的前三列,以及在他們有2或3的任何其他列,然後將它們粘貼到第二個工作表。不過,我讀過關於使用聯盟,這似乎是要走的路,但它是我的頭。

在此先感謝您提供任何解決方案。

+0

什麼樣的工作表? [CSV](http://en.wikipedia.org/wiki/Comma-separated_values)或電子表格? – Wilf

+0

謝謝。這是一個電子表格。 – user3353004

回答

0

我沒有看到的Union的相關性,所以我希望我沒有誤解你的要求。

的第一個任務是確定最後的行和列。有多種技術可以找到最後一行或一列;在任何情況下都不適用。我相信SpecialCells在這種情況下是最合適的。

當我不確定如何實現某些目標時,我將其分解爲小任務,編碼任務1並使用Debug.Print將診斷信息輸出到即時窗口。當我有任務1工作時,我將任務2的代碼與新的診斷信息一起添加。所以我的第一個宏,Demo1只是輸出最後一行和一列。嘗試將值放在任何現有值的左側或下方,以查看宏輸出的內容。

注意:我說一點關於我使用的語句。一般而言,一旦知道它存在就很容易查詢一個聲明。如有必要,請回復問題,但請先嚐試自己的調查。

Option Explicit 
Sub Demo1() 

    Dim ColLast As Long 
    Dim RowLast As Long 

    ' Replace "Source" with the name of your worksheet 
    With Worksheets("Source") 

    ColLast = Cells.SpecialCells(xlCellTypeLastCell).Column 
    RowLast = Cells.SpecialCells(xlCellTypeLastCell).Row 

    End With 

    Debug.Print "Last column " & ColLast 
    Debug.Print "Last row " & RowLast 
    ' Note Cells(RowLast, ColLast) does not have to contain a value. 

End Sub 

下一個任務是確定要刪除的列。我使用工作表函數CountIf來計算每列中從列4開始的2和3的列數,即列「D」。

Sub Demo2() 

    Dim ColCrnt As Long 
    Dim ColLast As Long 
    Dim Rng As Range 
    Dim RowLast As Long 

    With Worksheets("Source") 

    ColLast = Cells.SpecialCells(xlCellTypeLastCell).Column 
    RowLast = Cells.SpecialCells(xlCellTypeLastCell).Row 

    For ColCrnt = 4 To ColLast 
     Set Rng = .Range(.Cells(1, ColCrnt), .Cells(RowLast, ColCrnt)) 
     Debug.Print ColCrnt; 
     Debug.Print " Num 2s=" & WorksheetFunction.CountIf(Rng, 2); 
     Debug.Print " Num 3s=" & WorksheetFunction.CountIf(Rng, 3) 
    Next 

    End With 

End Sub 

最後的任務是刪除沒有2s和3s的列。對於Demo2我使用了For-Loop。 For循環的問題是你不能在循環內改變End值,我們需要在刪除列時做到這一點。所以對於Demo3,我必須使用Do-Loop。

Sub Demo3() 

    Dim ColCrnt As Long 
    Dim ColLast As Long 
    Dim Rng As Range 
    Dim RowLast As Long 

    With Worksheets("Source") 

    ColLast = Cells.SpecialCells(xlCellTypeLastCell).Column 
    RowLast = Cells.SpecialCells(xlCellTypeLastCell).Row 

    ColCrnt = 4 
    Do While ColCrnt <= ColLast 
     Set Rng = .Range(.Cells(1, ColCrnt), .Cells(RowLast, ColCrnt)) 
     If WorksheetFunction.CountIf(Rng, 2) + _ 
     WorksheetFunction.CountIf(Rng, 3) > 0 Then 
     ' This column contains a 2 or a 3. Do not delete column. 
     ' Advance to next column 
     ColCrnt = ColCrnt + 1 
     Else 
     ' This column does not contain a 2 or 3. Delete column. 
     .Columns(ColCrnt).EntireColumn.Delete 
     ' Reduce ColLast to allow for deletion. 
     ColLast = ColLast - 1 
     End If 
    Loop 

    End With 

End Sub 

希望以上幫助。

+0

嗨託尼,感謝您的代碼,它完美的作品。對不起,花了這麼長時間迴應。 – user3353004

相關問題