VBA基于值1将两列从一个工作簿复制到另一个工作簿

VBA基于值1将两列从一个工作簿复制到另一个工作簿,vba,excel,Vba,Excel,尝试将所选工作簿中的两列(从第13行开始的“C”列和“D”列)中的帐号和事务实例复制到我的工作簿,但前提是D列中的值大于1。此外,列中的最后一行标记为“总计”,因此显然我不想包括该行 到目前为止,我的情况如下: Private Sub CmdGetData_Click() Dim wb As Workbook, wb2 As Workbook Dim NewFile As Variant Dim ws As Worksheet, ws2 As Worksheet NewFile = App

尝试将所选工作簿中的两列(从第13行开始的“C”列和“D”列)中的帐号和事务实例复制到我的工作簿,但前提是D列中的值大于1。此外,列中的最后一行标记为“总计”,因此显然我不想包括该行

到目前为止,我的情况如下:

Private Sub CmdGetData_Click()

Dim wb As Workbook, wb2 As Workbook
Dim NewFile As Variant
Dim ws As Worksheet, ws2 As Worksheet


NewFile = Application.GetOpenFilename("Excel-files (*.xlsx*, *.xlsx*")

If NewFile <> False Then
Set wb = ThisWorkbook
Set wb2 = Workbooks.Open(NewFile)
End If

Set ws = Worksheets("Main")
Set ws2 = wb2.Worksheets("IVR Late Fee Clean Up")

        lastrow1 = ws.Cells(Rows.Count, 2).End(xlUp).Row

        For i = 13 To lastrow2
            lastrow2 = wb2.ws2.Cells(Rows.Count, 3).End(xlUp).Row
            If wb2.ws2.Range("C" & i).Value = "Grand Total" Then GoTo Skip
            If wb2.ws2.Range("D" & i).Value = "2" Then
                wb.ws.Range("B" & lastrow1 + 1).Value = wb2.ws2.Range("C" & i)
                wb.ws.Range("C" & lastrow1 + 1).Value = wb2.ws2.Range("D" & i)
            End If
        Next i
Skip:

End Sub
Private Sub CmdGetData\u Click()
将wb设置为工作簿,将wb2设置为工作簿
将新文件作为变量
将ws设置为工作表,将ws2设置为工作表
NewFile=Application.GetOpenFilename(“Excel文件(*.xlsx*,*.xlsx*”)
如果NewFile为False,则
设置wb=ThisWorkbook
设置wb2=工作簿.打开(新文件)
如果结束
设置ws=工作表(“主”)
设置ws2=wb2.工作表(“IVR滞纳金清理”)
lastrow1=ws.Cells(Rows.Count,2).End(xlUp).Row
对于i=13到最后一行2
lastrow2=wb2.ws2.Cells(Rows.Count,3).End(xlUp).Row
如果wb2.ws2.Range(“C”&i).Value=“总计”,则转到跳过
如果wb2.ws2.Range(“D”&i).Value=“2”,则
wb.ws.Range(“B”和lastrow1+1).Value=wb2.ws2.Range(“C”和i)
wb.ws.Range(“C”和lastrow1+1).Value=wb2.ws2.Range(“D”和i)
如果结束
接下来我
跳过:
端接头
我遇到的问题是“运行时错误'9:下标超出范围”

请帮忙!

1.
如果wb2.ws2.Range(“C”&i).Value=“总计”,则转到跳过

需要:

If ws2.Range("C" & i).Value = "Grand Total" Then GoTo Skip
ws.Range("B" & lastrow1 + 1).Value = ws2.Range("C" & i)
2.此外

wb.ws.Range("B" & lastrow1 + 1).Value = wb2.ws2.Range("C" & i)
需要:

If ws2.Range("C" & i).Value = "Grand Total" Then GoTo Skip
ws.Range("B" & lastrow1 + 1).Value = ws2.Range("C" & i)
等等

3.还有最后一件事,您有一个
For
循环:

For i = 13 To lastrow2
但是,到目前为止,您从未为
lastrow2
设置过值,仅在以下行设置:

lastrow2 = wb2.ws2.Cells(Rows.Count, 3).End(xlUp).Row
因此,您需要将其向上移动两行代码


修改代码

选项显式
私有子CmdGetData_Click()
将wb设置为工作簿,将wb2设置为工作簿
将新文件作为变量
将ws设置为工作表,将ws2设置为工作表
暗淡的最后一行1一样长,最后一行2一样长,我一样长
NewFile=Application.GetOpenFilename(“Excel文件(*.xlsx*,*.xlsx*”)
如果NewFile为False,则
设置wb=ThisWorkbook
设置wb2=工作簿.打开(新文件)
'=======下面的所有代码都需要在If NewFile False Then部分中=====
设置ws=wb.工作表(“主”)
设置ws2=wb2.工作表(“IVR滞纳金清理”)
lastrow1=ws.Cells(Rows.Count,2).End(xlUp).Row
lastrow2=ws2.Cells(Rows.Count,3).End(xlUp).Row
对于i=13到最后一行2
如果ws2.Range(“C”&i).Value=“总计”,则退出
如果ws2.Range(“D”&i).Value=“2”,则
ws.Range(“B”和lastrow1+1).Value=ws2.Range(“C”和i).Value
ws.Range(“C”和lastrow1+1).Value=ws2.Range(“D”和i).Value
如果结束
接下来我
如果结束
端接头
1.
如果wb2.ws2.Range(“C”&i).Value=“总计”,则转到跳过

需要:

If ws2.Range("C" & i).Value = "Grand Total" Then GoTo Skip
ws.Range("B" & lastrow1 + 1).Value = ws2.Range("C" & i)
2.此外

wb.ws.Range("B" & lastrow1 + 1).Value = wb2.ws2.Range("C" & i)
需要:

If ws2.Range("C" & i).Value = "Grand Total" Then GoTo Skip
ws.Range("B" & lastrow1 + 1).Value = ws2.Range("C" & i)
等等

3.还有最后一件事,您有一个
For
循环:

For i = 13 To lastrow2
但是,到目前为止,您从未为
lastrow2
设置过值,仅在以下行设置:

lastrow2 = wb2.ws2.Cells(Rows.Count, 3).End(xlUp).Row
因此,您需要将其向上移动两行代码


修改代码

选项显式
私有子CmdGetData_Click()
将wb设置为工作簿,将wb2设置为工作簿
将新文件作为变量
将ws设置为工作表,将ws2设置为工作表
暗淡的最后一行1一样长,最后一行2一样长,我一样长
NewFile=Application.GetOpenFilename(“Excel文件(*.xlsx*,*.xlsx*”)
如果NewFile为False,则
设置wb=ThisWorkbook
设置wb2=工作簿.打开(新文件)
'=======下面的所有代码都需要在If NewFile False Then部分中=====
设置ws=wb.工作表(“主”)
设置ws2=wb2.工作表(“IVR滞纳金清理”)
lastrow1=ws.Cells(Rows.Count,2).End(xlUp).Row
lastrow2=ws2.Cells(Rows.Count,3).End(xlUp).Row
对于i=13到最后一行2
如果ws2.Range(“C”&i).Value=“总计”,则退出
如果ws2.Range(“D”&i).Value=“2”,则
ws.Range(“B”和lastrow1+1).Value=ws2.Range(“C”和i).Value
ws.Range(“C”和lastrow1+1).Value=ws2.Range(“D”和i).Value
如果结束
接下来我
如果结束
端接头

谢谢大家的意见。下面的代码有效!(谢谢@ShaiRado)

Private Sub CmdGetData\u Click()
将wb设置为工作簿,将wb2设置为工作簿
将新文件作为变量
将ws设置为工作表,将ws2设置为工作表
NewFile=Application.GetOpenFilename(“Excel文件(*.xlsx*,*.xlsx*”)
如果NewFile为False,则
设置wb=ThisWorkbook
设置wb2=工作簿.打开(新文件)
如果结束
设置ws=wb.Sheets(“主”)
设置ws2=wb2.Sheets(“IVR滞纳金清理”)
lastrow1=ws.Cells(Rows.Count,2).End(xlUp).Row
lastrow2=ws2.Cells(Rows.Count,3).End(xlUp).Row
对于i=13到最后一行2
如果ws2.Range(“C”&i).Value=“总计”,则转到跳过
如果ws2.Range(“D”&i).Value=“2”,则
ws.Range(“B”和lastrow1+1).Value=ws2.Range(“C”和i)
ws.Range(“C”和lastrow1+1).Value=ws2.Range(“D”和i)
如果结束
接下来我
跳过:
端接头

还有@Ryszard:我没有得到调试选项,因为我是从脚本编辑器运行的,而不是从实际的命令按钮。我的错误。

谢谢大家的输入。下面的代码有效!(谢谢@ShaiRado)

Private Sub CmdGetData\u Click()
将wb设置为工作簿,将wb2设置为工作簿
将新文件作为变量
将ws设置为工作表,将ws2设置为工作表
NewFile=Application.GetOpenFilename(“Excel文件(*.xlsx*,*.xlsx*”)
如果NewFile为False,则
设置wb=ThisWorkbook
设置wb2=工作簿.打开(新文件)
如果结束
设置ws=wb.Sheets(“主”)
设置ws2=wb2.Sheets(“IVR滞纳金清理”)
lastrow1=ws.Cells(Rows.Count,2).End(xlUp).Row
lastrow2=ws2.Cells(Rows.Count,3).End(xlUp).Row
对于i=13到最后一行2