Перебирайте 2 списка в Excel с помощью VBA для копирования данных вкладок из одного в другой

#excel #vba #loops #copy

#excel #vba #циклы #Копировать

Вопрос:

У меня есть 2 набора диапазонов; Пути к исходным файлам и пути к файлам назначения.

Я хочу перебрать каждый список, чтобы открыть исходный файл и скопировать вкладку / лист в путь к файлу назначения.

Ниже приведен код, который я использовал для перебора списка источников и копирования данных с вкладки в этой книге и вставки их на именованный лист. Имя вкладки копирования указано в коде offset, 1 ниже, и имя вставки никогда не изменится.

Этот шаг подготавливает рабочую книгу, поэтому теперь я могу скопировать эту вкладку в совершенно отдельную рабочую книгу, которую я перечислил.

Возможно ли это эффективно сделать с помощью цикла for??

 Sub RollQuarter()

Dim Wbk As Workbook
Dim Wks As Worksheet
Dim Filepath As String, Filename As String, sStg As String
Dim oDic As Scripting.Dictionary
Dim rng As Range, c As Range
Dim varKey As Variant

With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
End With

Set oDic = New Scripting.Dictionary
oDic.CompareMode = TextCompare

sStg = ""

Set rng = Union(Range("dummy")) 'Source files
 
For Each c In rng.Cells
    If Not oDic.Exists(c.Value) Then
        oDic.Add c.Value, c.Offset(, 1).Value
    Else
        MsgBox "Duplicate Item found", vbInformation, "Error Message"
        Exit Sub
    End If
Next c

For Each varKey In oDic.Keys
    If Len(Dir(varKey)) = 0 Then
        If sStg = "" Then
            sStg = oDic.Item(varKey)
        Else
            sStg = sStg amp; ", " amp; vbCrLf amp; oDic.Item(varKey)
        End If
    Else
        On Error Resume Next
        Set Wbk = Workbooks.Open(varKey, False)
        On Error GoTo 0
        If Wbk Is Nothing Then
        Else
            With Wbk
                .Sheets(oDic.Item(varKey)).Cells.Copy
                .Sheets("dummy sheet").Cells.PasteSpecial xlPasteValues
                Application.CutCopyMode = False
                .Save
            End With

            Wbk.Close False
            Set Wbk = Nothing
        End If
    End If

Next varKey

.....

If Len(sStg) > 0 Then MsgBox "The below files do not exist" amp; vbCrLf _
                        amp; sStg, vbCritical

End Sub
 

Комментарии:

1. Не совсем понятно, о чем вы спрашиваете. Судя по вашему коду, похоже, что вы уже достаточно хорошо отсортированы для завершения решения. Эффективность — расплывчатый термин. Вам нужна эффективность пространства (памяти), эффективность скорости или, возможно, какая-то другая эффективность? Я бы предположил, что использование цикла ‘for’, вероятно, подойдет вам, но это зависит от того, какую эффективность вы хотите.

2. Привет, Марк — Приведенный выше код позволяет мне открывать только книгу и копировать данные в этой книге, затем закрывать и открывать следующую книгу в диапазоне. Теперь мне нужна функция, которая позволит мне открывать 2 отдельные книги, копировать из одной в другую, а затем закрывать обе книги и открывать следующие 2 в их повторных диапазонах и повторять шаги.