VBA在预定列中过滤不同工作表上的某些单元格值

VBA的神,

我想请求你的一些代码我似乎无法正常工作的帮助。

目的,

当一行的单元格的值为“x”,表格“转储”中的行A时,我想过去表“testing”中的某些值。 需要在Sheet'test'上张贴的值在B,D,F和L列。

B栏中的值,'Dump'表应该转到D4,在'test'表中。

D栏中的值,“工作表转储”应该在工作表“testing”中转到C4。

F栏中的值,“转储”表应该转到A4,在“testing”表中。

来自列L的值,工作表“转储”应该转到工作表“testing”中的E4。

当然,我试图使VBA循环,因为当工作表“转储”多行包含字符“X”,它继续从D / C / A / E4到下一行。

我已经有工作的代码贴在这里:

Sub test() Dim i, LastRow LastRow = Sheets("Dump").Range("A" & Rows.Count).End(xlUp).Row Sheets("test").Range("A2:K200").ClearContents For i = 2 To LastRow If Sheets("Dump").Cells(i, "A").Value = "x" Then Sheets("Dump").Range(Cells(i, "B"), Cells(i, "B")).Copy Destination:=Sheets("test").Range("A" & Rows.Count).End(xlUp).Offset(1) End If Next i End Sub 

一直在尝试使用很多不同的VBA源,并对其进行了一些调整。 如果我从一个错误的源头开始,或者正在犯一些n00b错误,请指导我做错了什么。 只是试图学习,而编码。

你可以尝试以下。

 Sub test() Dim i, LastRow LastRow = Sheets("Dump").Range("A" & Rows.Count).End(xlUp).Row Sheets("test").Range("A2:K200").ClearContents j = 4 For i = 2 To LastRow If Sheets("Dump").Cells(i, "A").Value = "x" Then Sheets("test").Cells(j, 4) = Sheets("Dump").Cells(i, 2).Value Sheets("test").Cells(j, 3) = Sheets("Dump").Cells(i, 3).Value Sheets("test").Cells(j, 1) = Sheets("Dump").Cells(i, 6).Value Sheets("test").Cells(j, 5) = Sheets("Dump").Cells(i, 12).Value j = j + 1 End If Next i End Sub 

您需要单独跟踪test表中的每一行,因此添加j = 4 (因为您想从第4行开始)。

编辑

如果你给他们打电话,我会定义你的床单。

 Sub test() Dim i, LastRow, source as Worksheet, dest as Worksheet Set source = ActiveWorkbook.Sheets("Dump") Set dest = ActiveWorkbook.Sheets("test") LastRow = source.Range("A" & Rows.Count).End(xlUp).Row dest.Range("A2:K200").ClearContents j = 4 For i = 2 To LastRow With source If .Cells(i, "A").Value = "x" Then dest.Cells(j, 4) = .Cells(i, 2).Value dest.Cells(j, 3) = .Cells(i, 3).Value dest.Cells(j, 1) = .Cells(i, 6).Value dest.Cells(j, 5) = .Cells(i, 12).Value j = j + 1 End If End With Next i End Sub 

Tim发布了更好的方法来复制值,但这是你的代码有什么问题:

复制的语法是

 sourceRange.Copy Destination:=destinationRange 

:=指定了.Copy方法的选项/参数。 这可能会令人困惑,因为围绕论点的括号没有像其他语言所期望的那样。

 someMethod(argument1, argument2) 

将会

 someMethod argument1, argument2 

如果行中没有其他东西(否则你需要括号)。

您可以通过命名并使用:=来指定您使用的参数。 这对于可选参数或保持代码可读性特别有用(您可能不记得几个月内每个参数是什么)。 有些人保持参数为空,但我认为这是显而易见的

 someMethod paramName1:=True, paramName4:=False, paramName5:=True 

比比较容易阅读

 someMethod True, , , False, True 

(我假设参数名称是描述性的像Destination )。

函数的参数需要和函数在同一行。 要连接行,删除换行符(duh)或在行尾放置一个_ (如果变长)。

圆括号和换行符的示例:

 Set someRange = rangeToSearch.Find( _ What:="abc", _ LookIn:=xlValues, _ MatchCase:=True) 

无括号和换行符的示例:

 destinationRange.PasteSpecial Paste:=xlPasteValues, skipblanks:=True