Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 根据行号将单元格从表1中的B:D列复制到表2中的C:E列_Excel_Excel 2016_Vba - Fatal编程技术网

Excel 根据行号将单元格从表1中的B:D列复制到表2中的C:E列

Excel 根据行号将单元格从表1中的B:D列复制到表2中的C:E列,excel,excel-2016,vba,Excel,Excel 2016,Vba,我有一个工作表(Sheet2),其中在B:D列的不同行号处粘贴了行 这些行号实际上与工作表(Sheet1)中的行号相对应,这些行号是空白的,我希望将单元格动态粘贴到C:E列中 我有以下代码,它允许我根据text value=“LAW”从B:D列复制行,并粘贴到Sheet1中,只要我知道C列中单元格的范围 我想我要寻找的是当找到“LAW”时的等价物,将该行与Sheet1中的一行匹配,并粘贴到C列。循环是必要的,因为在其他情况下,找到了“LAW”,这些单元格需要粘贴到适当的单元格范围 Dim

我有一个工作表(Sheet2),其中在B:D列的不同行号处粘贴了行

这些行号实际上与工作表(Sheet1)中的行号相对应,这些行号是空白的,我希望将单元格动态粘贴到C:E列中

我有以下代码,它允许我根据text value=“LAW”从B:D列复制行,并粘贴到Sheet1中,只要我知道C列中单元格的范围

我想我要寻找的是当找到“LAW”时的等价物,将该行与Sheet1中的一行匹配,并粘贴到C列。循环是必要的,因为在其他情况下,找到了“LAW”,这些单元格需要粘贴到适当的单元格范围

    Dim WBT As Workbook
    Dim WSD1 As Worksheet
    Dim WSD2 As Worksheet

    Set WBT = Workbooks("Invoices.csv")
    Set WSD1 = WBT.Worksheets("Sheet1")
    Set WSD2 = WBT.Worksheets("Sheet2")


    Set r2 = WSD1.Range("C11")

    With WSD2
        N = .Cells(Rows.Count, "B").End(xlUp).row
        For i = 1 To N
           If .Cells(i, "B").Value = "LAW" Then
                Set r1 = Range(.Cells(i, "B"), .Cells(N, "D"))
                r1.Copy r2
           End If
        Next i
    End With
我发现很难想出一个故障保护解决方案,但我希望有人能给我一些建议,我应该如何去做

下面的示例演示了我希望查找Sheet2中的行,并将它们粘贴到Sheet1中的突出显示点。如果有一种方法可以动态地表示Sheet2上B列中的文本是否等于LAW,则将该行(从B列复制到D列)复制到Sheet1中的等效行。在我的示例中,我有两个发生这种情况的实例

在@SJR成功修改脚本之后,我遇到了一个问题,工作簿有很多页。因此,我修改了代码,并使用一个函数来测试工作表是否存在(默认情况下不存在)

并将代码复制如下:

Dim r1 As Range
Dim r2 As Range
Dim N As Long
Set r2 = WSD1.Range("C1:C100")

With WSD2
    If Not SheetExists("Sheet1") Then
        N = .Cells(Rows.Count, "B").End(xlUp).row
                For i = 1 To N
                    If .Cells(i, "B").Value = "LAW" Then
                        Set r1 = Range(.Cells(i, "B"), .Cells(i, "D"))
                        r1.Copy WSD1.Cells(i, "C")
                    End If
                Next i
    Else
        On Error Resume Next
    End If
End With

With WSD3
    If Not SheetExists("Sheet2") Then
        N = .Cells(Rows.Count, "B").End(xlUp).row
                For i = 1 To N
                    If .Cells(i, "B").Value = "LAW" Then
                        Set r1 = Range(.Cells(i, "B"), .Cells(i, "D"))
                        r1.Copy WSD1.Cells(i, "C")
                    End If
                Next i
    Else
       On Error Resume Next
    End If
End With

尽管在工作簿有两张工作表的情况下,这可以很好地工作,但它会落在引用WSD3的第二个脚本上,位于
N=.Cells(Rows.Count,“B”).End(xlUp).row
,运行时错误为“91”。通过单步遍历代码,我发现如果您将鼠标悬停在范围???上,R1的变量会显示一条消息????虽然我试图弄明白为什么它说变量没有设置,但我还是感到困惑

你能试试这个吗?我想你在排队时出了点差错

Sub x()

Dim WBT As Workbook
Dim WSD1 As Worksheet
Dim WSD2 As Worksheet, N As Long

Set WBT = Workbooks("Invoices.csv")
Set WSD1 = WBT.Worksheets("Sheet1")
Set WSD2 = WBT.Worksheets("Sheet2")
Set r2 = WSD1.Range("C11")

With WSD2
    N = .Cells(Rows.Count, "B").End(xlUp).Row
    For i = 1 To N
       If .Cells(i, "B").Value = "LAW" Then
            Set r1 = .Range(.Cells(i, "B"), .Cells(i, "D"))
            r1.Copy WSD1.Cells(i, "C")
       End If
    Next i
End With

End Sub

您能给我们看一个数据示例吗?它现在是什么样子,以及在代码运行后应该是什么样子?(请尽可能少的行/列来演示它)如果它们对应于空白行,您不能做<代码> R1.VSD.1(C1)“C”?Find会比循环快。不太习惯Find方法@SJR,但我会尝试修改它以适应。我已经用我想做的一个例子重新编辑了我的问题。你试过我的建议了吗?今天就开始@SJR。我会让你知道我怎么走的。一个错误!我应该仔细看一下脚本@SJR。我现在已经用数据测试了我的脚本,并确认这部分工作得很好。现在我在@SJR上遇到了另一个问题(请参见编辑)。客户机现在在工作簿中有多个工作表,我需要在其中运行脚本以将行复制回原始工作表。然而,我得到了一个错误。为什么?代码只针对指定的工作表设置,因此您需要定义其他工作表或添加循环工作表。是的,这是真的@SJR,但是,我发现如果我在不同的选项中出错,那么这不是问题。
Sub x()

Dim WBT As Workbook
Dim WSD1 As Worksheet
Dim WSD2 As Worksheet, N As Long

Set WBT = Workbooks("Invoices.csv")
Set WSD1 = WBT.Worksheets("Sheet1")
Set WSD2 = WBT.Worksheets("Sheet2")
Set r2 = WSD1.Range("C11")

With WSD2
    N = .Cells(Rows.Count, "B").End(xlUp).Row
    For i = 1 To N
       If .Cells(i, "B").Value = "LAW" Then
            Set r1 = .Range(.Cells(i, "B"), .Cells(i, "D"))
            r1.Copy WSD1.Cells(i, "C")
       End If
    Next i
End With

End Sub