【问题标题】:VBA Error 400 when trying to copy/paste formulas and format in a loop尝试在循环中复制/粘贴公式和格式时出现 VBA 错误 400
【发布时间】:2016-07-19 17:54:40
【问题描述】:

我正在尝试将“masterrow”的格式和公式复制并粘贴到循环中的范围内。该循环还从另一个工作簿中获取数据,因此该工作簿是循环期间的 ActiveWorkbook。

我认为这个“ActiveWorkbook”问题是导致问题的原因,但我需要有关解决方案的帮助。我在下面提供了循环功能。我希望你能帮助我。

Sub Worksheet_UpdateAllItemCostData()

Dim material As Variant
Dim fndEntry As Range
Dim wb1 As Workbook, wb2 As Workbook
Dim lr As Long, I As Long

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Set wb1 = ActiveWorkbook

lr = wb1.Sheets("Sagsnr.").Cells(Rows.Count, "C").End(xlUp).Row

If lr < 21 Then
    Exit Sub
End If

Workbooks.Open Filename:="G:\Backoffice\Tilbudsteam\Kostdatabase\Matcost.xls", ReadOnly:=True

Set wb2 = ActiveWorkbook

    For I = 21 To lr

            wb1.Sheets("Sagsnr.").Rows("1:1").Select
            selection.Copy
            wb1.Sheets("Sagsnr.").Rows(I).Select
            selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
            SkipBlanks:=True, Transpose:=False
            selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
            selection.EntireRow.Hidden = False

    material = wb1.Sheets("Sagsnr.").Range("C" & I).Value

    Set fndEntry = wb2.Sheets("Matcost").Range("D:D").Find(What:=material)

    If Not fndEntry Is Nothing Then

            wb1.Sheets("Sagsnr.").Range("B" & I).Value = wb2.Sheets("Matcost").Range("H" & fndEntry.Row).Value  'Product group
            wb1.Sheets("Sagsnr.").Range("E" & I).Value = wb2.Sheets("Matcost").Range("Q" & fndEntry.Row).Value   'Available Stock

        End If

    Set fndEntry = wb2.Sheets("Matcost").Range("C:C").Find(What:=material)

        If Not fndEntry Is Nothing Then

            wb1.Sheets("Sagsnr.").Range("B" & I).Value = wb2.Sheets("Matcost").Range("H" & fndEntry.Row).Value  'Product group
            wb1.Sheets("Sagsnr.").Range("E" & I).Value = wb2.Sheets("Matcost").Range("Q" & fndEntry.Row).Value   'Available Stock

        End If
Next I

wb2.Close

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

【问题讨论】:

  • 也许您可以尝试删除所有Select 和Selection。 Look here for HowTo
  • 您是否尝试过逐行运行代码以准确查看错误发生的位置?
  • 谢谢,我会浏览你的参考主题文森特 G,但如果你也能看到解决方案,很高兴知道。我还处于学习阶段。 @Clusks - 我有,如果我跳过激活 wb2 的整个循环,它工作正常,所以这让我得出结论,这是一个 ActiveWorkbook 问题,但我无法理解它。

标签: vba excel


【解决方案1】:

正如你所说,激活wb2 时可能是ActiveWorkbook 问题,你应该试试这个:

Set wb2 = Workbooks.Open (Filename:="G:\Backoffice\Tilbudsteam\Kostdatabase\Matcost.xls", ReadOnly:=True)

而不是

Workbooks.Open Filename:="G:\Backoffice\Tilbudsteam\Kostdatabase\Matcost.xls", ReadOnly:=True

Set wb2 = ActiveWorkbook

另外,如果您的代码在 wb1 中,您可以避免使用 ActiveWorkbook 并执行以下操作:

Set wb1 = ThisWorkbook

作为附加建议,您应该尽量避免在您的代码How to avoid Select in Excel VBA macros 中使用.Select

【讨论】:

  • 感谢您的建议,但它仍然会抛出一个错误,我认为这与我是否将 wb2 设置为 ActiveWorkbook 的事实有关,它以某种方式在 wb2 中工作。错误在到达 selection.copy 行的那一刻被抛出
  • 如果你去掉 .Select 和 Selection. 会发生什么?粘贴时写wb1.Sheets("Sagsnr.").Rows("1:1").Copy相同
  • 非常感谢,有时它就这么简单,就在我面前。
猜你喜欢
  • 2019-09-18
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2019-05-20
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多