2017-07-14 103 views
0

我想實現一個簡單的for-each是應該將數據從一個工作表(模板)複製到另一個(原始數據)語句,接着是另一個「潔淨up'for-each + If語句,該語句應該清除先前複製的所有單元格,除了具有預定義計算的5個單元格之外。Excel的VBA對於每個+ if語句的異常問題

我開始與-每個清除所有字段(和工作確定),不同的是後來我想,我需要一些字段的例外的事實陳述。所以,我添加了一個簡單的If語句,它指示Sub在沒有清除它的情況下轉到下一個單元格,以防這些特定的單元格區域出現。

運行的代碼時

出於某種原因,它會清除,除了現場K15定義的範圍未包含在例外中的所有領域,我不知道爲什麼發生這種情況; __;我試過解決這個問題,但不能提出任何問題。

我的代碼粘貼下面。任何意見將不勝感激 - 包括任何改進代碼的提示。謝謝!

Sub CopyData() 

Dim TargetRow, CopyRange, Cell As Range 
Dim RowCount, ColumnCount, ColumnLast, ColC As Long 
Dim ws As Worksheet 

Application.ScreenUpdating = False 

ColumnCount = 1 
ColumnLast = 51 
ColC = 1 
Set ws = ThisWorkbook.ActiveSheet 
Set CopyRange = Range("C10:C15,C17:C18,E12,E17:E18,K4:K6,K9,K11:K45") 

Sheets("RawData").Activate 
RowCount = Range("A1").CurrentRegion.Rows.Count + 1 

Set TargetRow = Range(Cells(RowCount, ColumnCount), Cells(RowCount, ColumnLast)) 

For Each Cell In CopyRange 
    TargetRow.Cells(ColC).Value = Cell.Value 
    ColC = ColC + 1 
Next Cell 

ws.Activate 

For Each Cell In CopyRange 
    If Cell = Range("K4") Or Cell = Range("K5") Or Cell = Range("K6") Or Cell = Range("K9") _ 
    Or Cell = Range("K46") Then 
     GoTo Forward 
    Else 
     Cell.Value = "" 
    End If 
Forward: 
Next Cell 

Application.ScreenUpdating = True 

End Sub 
+0

你知道,'細胞=範圍(「K4」)'(等)是'Cell.Value = Range(「K4」)的縮寫。 If語句將每個單元格的值與其他各個單元格的值進行比較,而不是比較**地址**。 (我無法理解這個問題 - 早上太早了,我還沒有喝過早晨的咖啡 - 但是,如果這是問題,請使用'Cell.Address =「$ K $ 4」等)或者有兩個範圍 - 一個用於複製,一個用於清理(不包括那些你不想清理的範圍)。 – YowE3K

+0

我沒有意識到!就是這樣,就像一個魅力,甜美的感謝! 如果您有任何其他建議,有什麼方法可以改善在這裏我最好比感激:-) – WAR

+0

越多不使用保留字,或者是什麼樣子的保留字,變量名....細胞看起來像細胞,保留....使用Cel或myCell或rCell – jsotola

回答

1

你行說

If Cell = Range("K4") Or Cell = Range("K5") Or _ 
    Cell = Range("K6") Or Cell = Range("K9") Or _ 
    Cell = Range("K46") Then 
    GoTo Forward 

相當於

If Cell.Value = Range("K4").Value Or Cell.Value = Range("K5").Value Or _ 
    Cell.Value = Range("K6").Value Or Cell.Value = Range("K9").Value Or _ 
    Cell.Value = Range("K46").Value Then 
    GoTo Forward 

我想你想用

If Cell.Address = Range("K4").Address Or Cell.Address = Range("K5").Address Or _ 
    Cell.Address = Range("K6").Address Or Cell.Address = Range("K9").Address Or _ 
    Cell.Address = Range("K46").Address Then 
    GoTo Forward 

這相當於

If Cell.Address = "$K$4" Or Cell.Address = "$K$5" Or _ 
    Cell.Address = "$K$6" Or Cell.Address = "$K$9" Or _ 
    Cell.Address = "$K$46" Then 
    GoTo Forward 

但你可能想也考慮有一個Range變量,包括要複製的細胞,另一Range變量,包括細胞進行清理。

0

這應該給你一個想法如何簡化一些代碼

使用F8單步執行這段代碼,看看你工作的同時

sub test() 

    ' the select statements are only to show the range, and are not needed 

    Range("a1").Select            ' get highlight out of the way 
    Range("C10:C15,C17:C18,E12,E17:E18,K4:K6,K9,K11:K45") = "abc123" 
    Range("C10:C12,C17:C18,E12").ClearContents 
    Range("C10:C15,C17:C18,E12,E17:E18,K4:K6,K9,K11:K45").SpecialCells(xlCellTypeBlanks).Select 
    Range("C10:C15,C17:C18,E12,E17:E18,K4:K6,K9,K11:K45").Select 
    Range("a1").Select 
    Range("C10:C15,C17:C18,E12,E17:E18,K4:K6,K9,K11:K45").ClearContents 
end sub 
+0

ClearContents將不起作用,因爲那裏有一些合併的單元格。 除此之外,不知道我會如何使用以上建議? 無論哪種方式 - 我改變了IF語句到一個單獨的範圍進行清理。這應該是更快的代碼;-) 謝謝大家的幫助! – WAR