【问题标题】:VBA Copy 2 Columns based on value of 1 From One Workbook to AnotherVBA 根据值 1 从一个工作簿复制 2 列到另一个工作簿
【发布时间】:2018-04-28 12:18:34
【问题描述】:

尝试将所选工作簿中 2 ​​列(“C”和“D”列,从第 13 行开始)的帐号和交易实例复制到我的工作簿,但前提是 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

我遇到的问题是“运行时错误'9':下标超出范围”。

请帮忙!

【问题讨论】:

  • 没有完整阅读您的代码,但您正在定义lastrow2 调用它之后。尝试将该行转移到lastrow1 下方。
  • @CMArg:移动了lastrow2 = 行,还是同样的错误。
  • 指定错误比“它不起作用”要好得多,但说明错误发生在哪一行会帮助每个人尝试解决问题。
  • @RyszardJędraszyk:错误在原始问题的末尾指定,“运行时错误'9':下标超出范围”。没有引用任何行来指示错误发生的位置。
  • 当您在出现错误消息后点击调试按钮时,VBA 编辑器中会突出显示有错误的行。

标签: vba excel


【解决方案1】:

1. If wb2.ws2.Range("C" &amp; i).Value = "Grand Total" Then GoTo Skip

需要:

If ws2.Range("C" & i).Value = "Grand Total" Then GoTo Skip

2.另外,

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

需要:

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

所以你需要将它向上移动 2 行代码。


修改后的代码

Option Explicit

Private Sub CmdGetData_Click()

Dim wb As Workbook, wb2 As Workbook
Dim NewFile As Variant
Dim ws As Worksheet, ws2 As Worksheet
Dim lastrow1 As Long, lastrow2 As Long, i As Long

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

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

    '====== ALL this code below needs to be inside the If NewFile <> False Then part =====

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

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

    For i = 13 To lastrow2
        If ws2.Range("C" & i).Value = "Grand Total" Then Exit For

        If ws2.Range("D" & i).Value = "2" Then
            ws.Range("B" & lastrow1 + 1).Value = ws2.Range("C" & i).Value
            ws.Range("C" & lastrow1 + 1).Value = ws2.Range("D" & i).Value
        End If
    Next i
End If

End Sub

【讨论】:

  • 感谢您的回复。这几乎是修复它的原因。请参阅下面的答案。
【解决方案2】:

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

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 = wb.Sheets("Main")
Set ws2 = wb2.Sheets("IVR Late Fee Clean Up")

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

        For i = 13 To lastrow2
            If ws2.Range("C" & i).Value = "Grand Total" Then GoTo Skip
            If ws2.Range("D" & i).Value = "2" Then
                ws.Range("B" & lastrow1 + 1).Value = ws2.Range("C" & i)
                ws.Range("C" & lastrow1 + 1).Value = ws2.Range("D" & i)
            End If
        Next i
Skip:

End Sub

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

【讨论】:

  • 如果你按“取消”,你仍然会得到一个错误,而且通常在 SO 上,当复制别人 95% 的代码和建议时,你给他们的功劳,不要复制>>粘贴为你自己的
  • @ShaiRado:是的,如果我取消文件选择,我仍然会收到错误消息。通过在 NewFile = Application.GetOpenFilename("Excel-files (*.xlsx*, *.xlsx*") 行之后添加 If TypeName(NewFile) = "Boolean" Then Exit Sub 进行更正。谢谢你提醒我。
  • @JustinF 在这个网站上,人们(在本例中为@Shai Rado)免费为您提供他们的时间和知识。请不要粗鲁,并通过接受答案而不是复制粘贴来承认这一点.....
  • @CMArg 谢谢 :) 我们在寻找什么,只是一点点认可
  • @CMArg - 我认出了 Shai。我意识到我没有说清楚和纠正的地方。没有他/她的帮助,我无法完成这项工作。
猜你喜欢
  • 2014-12-09
  • 2023-02-02
  • 2017-09-08
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多