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