Excel VBA Сбор данных из других файлов Excel и вставка их в Masterfile - PullRequest
0 голосов
/ 11 апреля 2019

Я программист C # и новичок в Excel VBA, и вот я на пределе. Я не понимаю, как копировать и вставлять данные из разных файлов в один мастер-файл ..

Я хочу собрать все данные из файлов Excel в пользовательскую папку. Эти данные всегда хранились в файлах Excel. И всегда начинается со столбца D до последнего столбца от 6-й строки до последней строки.

Итак, я хочу сначала получить каталог Parent, в который я получаю все файлы в этой папке Parent. После этого я запускаю процедуру CollectSubdata.

Так что мой подход - скопировать диапазон из каждого подфайла и вставить их в 6-ю строку и последний столбец моего мастер-файла

Private Sub CollectData()

Dim MasterWorkbook As Workbook
Set MasterWorkbook = Workbooks("Masterfile.xlsm")

Dim Folderpath As String
'Get Folder which contains all Data
Folderpath = UserGetFolder & "\"

Dim obj As Object
Dim ParentFolder As Object
Dim Files As Object

Set obj = CreateObject("Scripting.FileSystemObject")
Set ParentFolder = obj.GetFolder(Folderpath)
Set Files = ParentFolder.Files

Application.ScreenUpdating = False

'Loop through all folder now
Dim subfile As Object
For Each subfile In ParentFolder.Files

'Start Data Collection
Call CollectSubdata(subfile)

Next subfile


End Sub

Здесь моя подпроцедура

Private Sub CollectSubdata(ByRef subfile As Object)

' Do Data collection here
Dim subwb As Workbook
Dim LastColumn As Double
Dim LastRow As Double
Dim LastMasterCol As Double

LastMasterCol = MasterWorkbook.Sheets(1).Cells(6, Columns.Count).End(xlToLeft).Column

Set subwb = Workbooks.Open(subfile)
LastColumn = subwb.Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
LastRow = subwb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row

'Copy all necessary entries
subwb.Sheets(1).Range(Cells(6, 4), Cells(LastRow, LastColumn)).Copy

'Paste into Masterfile
MasterWorkbook.Sheets(1).Cells(6, LastMasterCol).PasteSpecial Paste:=xlPasteAll

subwb.Close
End Sub

А вот и моя пользовательская папка

Function UserGetFolder() As String
    Dim fldr As FileDialog
    Dim sItem As String
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    With fldr
        .Title = "Select a Folder"
        .AllowMultiSelect = False
        .InitialFileName = Application.DefaultFilePath
        If .Show <> -1 Then GoTo NextCode
        sItem = .SelectedItems(1)
    End With
NextCode:
    UserGetFolder = sItem
    Set fldr = Nothing
End Function

Я не понимаю, как VBA использует эти объекты и методы ..

1 Ответ

0 голосов
/ 11 апреля 2019

Переменная существует только в том контексте, в котором она определена. В вашем случае указатель masterworkbook определяется в подпрограмме CollectData, поэтому он существует только в этой подпрограмме. Чтобы получить его в CollectSubData, вам нужно либо передать ссылку на него в качестве аргумента подпрограмме, либо определить переменную на уровне модуля, чтобы она существовала для всех подпрограмм в этом модуле. Первый вариант - лучшая практика, поэтому вы должны определить ваш CollectSubData как

 Private Sub CollectSubdata(ByRef subfile As Object, ByRef MasterWorkbook As Workbook) 

и назовите его

 'Start Data Collection
 CollectSubdata(subfile,MasterWorkbook)

Обратите внимание, что Call не нужен в этом контексте (хотя это не так само по себе)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...