【问题标题】:vba - iterate over collectionvba - 遍历集合
【发布时间】:2017-06-19 01:01:40
【问题描述】:

我想将已关闭工作簿的某些列复制粘贴到我的活动工作簿中。 我的列是分开的,所以我想通过一个 Collection 变量的循环来做到这一点。

这是我的代码(编辑)

Option Explicit

Sub CopyDataFromClosedWbk()

    'copy data from closed workbook to active workbook
    Dim colonne As Collection
    Dim col As Variant
    Dim xlApp As Application
    Dim xlBook As Workbook
    Dim Sh As Object

    Set colonne = New Collection

    colonne.Add "A:B", "A1"
    colonne.Add "E:F", "G1"
    colonne.Add "N", "I1"
    colonne.Add "P", "F1"


    Set xlApp = CreateObject("Excel.Application")


    'Path source workbook
    Set xlBook = xlApp.Workbooks.Open("C:\Users\Amira AYADI\Desktop\Stage\Automatisation\Base Case_BDD CAPACITAIRE_ENVOYE_V2 2017_2023_24042017.xlsx")
    xlBook.Sheets("DATA").Range("A1:CJ374810").AutoFilter
    xlBook.Sheets("DATA").Range("BD1").Select
    xlBook.Sheets("DATA").Range("$A$1:$CJ$374810").AutoFilter Field:=56, Criteria1:="CMR"

    For Each col In colonne

        xlBook.Sheets("DATA").Range(col).Copy
        xlApp.DisplayAlerts = False
        Debug.Print col
        Set xlBook = Nothing
        Set xlApp = Nothing
        Set xlBook = ActiveWorkbook
        Set Sh = xlBook.Sheets("Calcul")
        'Sh.Activate
        Range(colonne.Item(col)).Select
        Sh.paste


    Next col

    xlBook.Close
    xlApp.Quit


End Sub

但这不起作用,并且有几个错误:

首先

Range(colonne.Item(col)).Select

我猜不要使用“col”但使用索引。那么如何迭代Key的值呢?

第二次当我像这样将 col 替换为 1 时(试一试):

Range(colonne.Item(1)).Select

我有一个 91 错误:未设置对象变量或 With 块。

除此之外,我还有一个弹出窗口说工作簿“source.xlsx”已准备好进行修改。我该如何禁用它?

你有什么想法吗?

【问题讨论】:

  • 不要使用.Select。此外,您在每个单元格之后打开和关闭工作臂,效率不高。
  • 我没注意,谢谢。如果我不使用 .select 我该怎么做?我试过 Range(colonne.Item(col)).Paste 但这不起作用
  • 您需要在此处使用 Scripting.Dictionary 代替 Collection,因此您可以访问键和值。 stackoverflow.com/questions/5702362/vba-collection-list-of-keys

标签: vba excel collections


【解决方案1】:

试试这个:

Option Explicit

Sub CopyDataFromClosedWbk()

    Dim xlApp As Application
    Dim xlBook As Workbook
    Dim sht As Worksheet, sht2 As Worksheet

    Set sht2 = ThisWorkbook.Sheets("Calcul")
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open("C:\Users\User\Desktop\source.xlsx") 'Adjust
    Set sht = xlBook.Worksheets("DATA")
    xlApp.DisplayAlerts = False

    sht.Range("A:CJ").AutoFilter Field:=56, Criteria1:="CMR"
    sht.Range("A:B").Copy: sht2.Range("A1").PasteSpecial xlPasteValues
    sht.Range("E:F").Copy: sht2.Range("G1").PasteSpecial xlPasteValues
    sht.Range("N:N").Copy: sht2.Range("I1").PasteSpecial xlPasteValues
    sht.Range("P:P").Copy: sht2.Range("F1").PasteSpecial xlPasteValues

    xlBook.Close
    xlApp.Quit
End Sub

我不知道是否有任何理由使用集合/字典来保存列,但这种方式更容易。

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 2012-11-03
    • 2014-04-11
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2011-01-30
    相关资源
    最近更新 更多