2017-08-15 112 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

相关问题