2017-08-15 114 views
-1

我有一張「數據」表。有了這張表,我正在查看K列。如果它是紅色的,那麼我將提取完整的行並將它們複製到另一張「延遲」表中。使用單元格值將數據從一張紙複製到另一張

我遵循以下代碼。代碼沒有任何錯誤,但是,它只是複製4行紅色,而我有12行。

任何人都可以幫助我找到我錯在哪裏,我需要什麼變化?

Sub delay() 
Dim cell As Range 
Dim nextrow As Long 
Dim a As Double 

Application.ScreenUpdating = False 
a = Application.WorksheetFunction.CountA(Sheets("Data").Range("K:K")) 
For Each cell In Sheets("Data").Range("K5:K" & a) 
If cell.DisplayFormat.Interior.Color = vbRed Then 
nextrow = Application.WorksheetFunction.CountA(Sheets("Delayed").Range("K:K")) 
Rows(cell.Row).Copy Destination:=Sheets("Delayed").Range("A" & nextrow + 1) 
End If 

Next 
Application.ScreenUpdating = False 
End Sub 
+2

使用'CountA'的基本原理是什麼? K列保證是非空的,直到列中最後使用的單元格爲止? – YowE3K

+0

@ YowE3K不,不保證 – Jenny

+0

那麼你想用'CountA'實現什麼? 'CountA'計算K列中有多少非空單元,然後用它來生成''K5:K「&a'和'」A「&nextrow + 1',即某種範圍。爲什麼數字或非空單元格確定您將要處理的最後一行? – YowE3K

回答

2

首先:
WorksheetFunction.CountA統計未出現空單元格的參數列表中值的數量,你不能用它來計算行的總數還是找最後一行的編號(除非所有的單元格都不是空的)。
什麼,你可能需要的是:

nmbRows = Workbook("WorkbookName").Worksheet("SheetName").Range("K" & Rows.Count).End(xlUp).Row 

什麼那麼生硬。
使用CountA可能會導致搜索範圍縮小,從而導致數據丟失,或者在您的情況下,在錯誤的位置插入一行。
實施例:結果的

Option Explicit 
Sub test() 
    Dim a As Long 
    a = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("Ëèñò1").Range("A:A")) 
    ThisWorkbook.Sheets("Ëèñò1").Range("B1").Value = a 
End Sub 



enter image description here
第二:
要謹慎,參考添加到每個rangesheet

ThisWorkbook.Sheets("Data").Range("K5:K" & nmbRows) 

通過這樣做,您始終可以確定您正在引用您想檢查的正確範圍。

另注:
我不是VBA的專家,但如果我是你,我會計算行對宏觀的開始分別爲每張紙的數量,在環我會用nextrow=nextrow + 1建設,而不是調用函數每一次。

+2

爲了兼容較大的工作表,你會明智地使用'nmbRows = Workbook(「WorkbookName」)。Worksheet(「SheetName」)。Range(「K」&rows.Count).End(xlUp )。而不是65,500行。 – CLR

+1

@CLR你說的對,2003年的壞習慣 – AntiDrondert

+0

你應該限定你的'行'來指定你指的是哪個工作表(特別是如果有多個工作簿打開,這意味着某些工作簿可能具有65536的「Rows.Count」其他人可能有1048576)。因此使用'nmbRows = Workbook(「WorkbookName」)。Worksheet(「SheetName」)。Range(「K」&Workbook(「WorkbookName」)。Worksheet(「SheetName」).Rows.Count).End(xlUp).Row '。 – YowE3K

相關問題