Excel VBA Сбор данных из других файлов Excel и вставка их в Masterfile
Я программист С# и новичок в Excel VBA, и вот я на пределе. Я не понимаю, как копировать и вставлять данные из разных файлов в один мастер файл..
Я хочу собрать все данные из файлов Excel в пользовательскую папку. Эти данные всегда хранились в файлах Excel. И всегда начинается со столбца D до последнего столбца от 6-й строки до последней строки.
Поэтому я хочу сначала получить каталог Parent, в который я получаю все файлы в этой папке Parent. После этого я CollectSubdata
процедуру 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 использует эти объекты и методы..
Переменная существует только в том контексте, в котором она определена. В вашем случае указатель masterworkbook определяется в подпрограмме CollectData, поэтому он существует только в этой подпрограмме. Чтобы получить его в CollectSubData, вам нужно либо передать ссылку на него в качестве аргумента подпрограмме, либо определить переменную на уровне модуля, чтобы она существовала для всех подпрограмм в этом модуле. Первое - лучшая практика, поэтому вы должны определить свой CollectSubData как
Private Sub CollectSubdata(ByRef subfile As Object, ByRef MasterWorkbook As Workbook)
и назвать это как
'Start Data Collection
CollectSubdata(subfile,MasterWorkbook)
Обратите внимание, что Call не нужен в этом контексте (хотя это не так само по себе)
Связанные вопросы
Похожие вопросы
Посмотрите другие вопросы по меткам vba excel или Задайте вопрос