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

时间:2016-12-01 08:37:15

标签: excel vba excel-vba macros

VBA之神,

我想请求您提供一些代码,但我似乎无法直接开展工作。

目的,

当一行有一个单元格值" x"在工作表中的第A行'转储',我想在工作表'测试'中过去某些值。 需要在Sheet' test'上发布的值位于B,D,F和L列。

B栏,表格'转储'应该转到D4,在表格'测试'。

D栏,表格' Dump'应该转到C4,在Sheet' test'。

F,Sheet' Dump'应该转到A4,在Sheet' test'。

L栏,表格' Dump'应该转到E4,在Sheet' test'。

当然,我试图让VBA循环,因为当Sheet' Dump'包含字符' 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错误,请指导我做错了什么。只是在编码时尝试学习。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

您可以尝试以下操作。

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