#excel #vba
Вопрос:
У меня следующая ситуация: есть основная папка с большим количеством вложенных папок. В каждой из этих вложенных папок есть 3-4 PDF-файла и, как правило, один файл Excel. Теперь я создал макрос, который после нажатия кнопки и выбора основной папки скопировал определенные столбцы файлов Excel из всех вложенных папок и объединил их на листе. Основной процесс копирования работает, но возникли следующие проблемы:
- Я хочу, чтобы копировались только значения ячеек, а не функции. К сожалению, я не смог найти рабочего решения этой проблемы.
- Редко случается, что во вложенной папке находится более одного файла Excel. В этом случае содержимое обоих файлов также должно быть скопировано. На данный момент копируется только содержимое одного файла. К сожалению, я тоже не смог найти решение здесь.
Я был бы очень признателен, если бы кто-нибудь мог мне здесь помочь.
Sub FolderNames()
'Update 20141027
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim xPath As String
Dim xWs As Worksheet
Dim fso As Object, j As Long, folder1 As Object
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Choose the folder"
.Show
End With
On Error Resume Next
xPath = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1) amp; ""
'Application.Workbooks.Add
Set xWs = ThisWorkbook.Sheets("FolderList")
xWs.Cells.Clear
xWs.Cells(1, 1).Value = xPath
xWs.Cells(2, 1).Value = "Path"
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder1 = fso.GetFolder(xPath)
getSubFolder folder1
xWs.Range("1:2").Delete xlUp
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Sub getSubFolder(ByRef prntfld As Object)
Dim SubFolder As Object
Dim subfld As Object
Dim xRow As Long
For Each SubFolder In prntfld.SubFolders
xRow = ThisWorkbook.Sheets("FolderList").Range("A1").End(xlDown).Row 1
ThisWorkbook.Sheets("FolderList").Cells(xRow, 1) = SubFolder.Path
Next SubFolder
For Each subfld In prntfld.SubFolders
getSubFolder subfld
Next subfld
End Sub
Sub getfiles()
Application.DisplayAlerts = False
Dim oFSO As Object
Dim oFolder As Object
Dim oFile As Object
Dim i As Integer
Dim lrow As Long
Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim FileFound As Boolean
Dim targetfile As Workbook
Dim firstfile As Boolean
firstfile = True
lrow = ThisWorkbook.Sheets("FolderList").Cells(Rows.Count, 1).End(xlUp).Row
Dim filecount As Long
filecount = 0
ThisWorkbook.Worksheets("Konsolidierung").Cells.Clear
For j = 1 To lrow
Set oFolder = oFSO.GetFolder(ThisWorkbook.Sheets("FolderList").Cells(j, 1).Text)
filecount = filecount 1
For Each oFile In oFolder.Files
If Right(oFile.Name, 4) = "xlsx" Then
FileFound = True
Set targetfile = Workbooks.Open(ThisWorkbook.Sheets("FolderList").Cells(j, 1).Text amp; "" amp; oFile.Name)
If firstfile Then
targetfile.Sheets(1).Range("A:F").Copy ThisWorkbook.Worksheets("Konsolidierung").Cells(1, 1)
firstfile = False
Else
targetfile.Sheets(1).Range("F:F").Copy ThisWorkbook.Worksheets("Konsolidierung").Cells(1, filecount 5)
End If
targetfile.Close False
End If
Next oFile
If FileFound = False Then
ThisWorkbook.Worksheets("Konsolidierung").Cells(1, filecount 5) = "Keine Datei gefunden"
Else
FileFound = False
End If
Next j
Application.DisplayAlerts = True
End Sub
Комментарии:
1. Попробуйте скопировать/прошлые значения вместо прямой копии.
2. Спасибо вам за ваше предложение. Я смог решить эту проблему.