Надеюсь, что у всех все хорошо.
Я пытаюсь скопировать/вставить имя файла в столбец A целевой книги. Ниже показано копирование данных из всех книг из папки и вставка их в мой мастер-файл.
Application.ScreenUpdating = False
Dim wkbDest As Workbook
Dim wkbSource As Workbook
Set wkbDest = ThisWorkbook
Dim LastRow As Long
Const strPath As String = "folder of data files"
ChDir strPath
strExtension = Dir("*.csv*")
Do While strExtension <> ""
Set wkbSource = Workbooks.Open(strPath & strExtension)
With wkbSource
LastRow = .Sheets("ADJUSTMENTS_EXTR").Cells.Find("Total", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
.Sheets("ADJUSTMENTS_EXTR").Range("A10:V" & LastRow).Copy wkbDest.Sheets("Consolidated Data").Cells(Rows.Count, "B").End(xlUp).Offset(0, 0)
.wkbDest.Range("A2" & LastRow) = wkbSource.Name
**'.wkbDest.Sheets("Consolidated Data").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) = wkbSource.Name**
.Close savechanges:=False
End With
strExtension = Dir
Loop
Application.ScreenUpdating = True
В папке данных обычно находится 5-6 файлов. Цель состоит в том, чтобы при копировании данных мне также требовалось имя каждого файла в столбце A моего основного файла вместе с данными. ниже то, что я пробовал. К сожалению, не удалось заставить это работать. Заранее спасибо.
.wkbDest.Sheets("Consolidated Data").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) = wkbSource.Name**
удалять . перед неделей недели
когда я удаляю «.», возвращает объект, не поддерживающий ошибку свойства.
Я не думаю, что можно использовать ChDir
с Dir
вот так..
это работает, пока я не добавлю .wkbDest.Range("A2" & LastRow) = wkbSource.Name.
Вы исправили ошибку, указанную в первом комментарии? .wkbDest.Range("A2" & LastRow) = wkbSource.Name
должно быть wkbDest.Range("A2" & LastRow) = .Name
эй, Тим, wkbDest.Range("A2" & LastRow) = .Name
также возвращает ошибку объекта.
Вы не указали целевой лист, так что возможно wkbDest.Worksheets("Consolidated Data").Range("A" & LastRow) = .Name
Какие файлы вы ищете? Для поиска файлов CSV используйте более точный "*.csv"
. Кроме того, файлы CSV содержат только один лист, и вы не можете ссылаться на листы разных файлов CSV в одной папке, используя одно и то же имя (ADJUSTMENTS_EXTR
). Обычно вы делаете это с индексом 1, т. е. wbkSource.Sheets(1)
. A2
предполагает, что заголовки уже заполнены на целевом листе. A10
предполагает, что первой строкой исходных данных является строка 10
. В каком столбце находится Total
? Вы уверены, что хотите скопировать строку итогов? Просьба уточнить.
Привет, Тим, не повезло с wkbDest.Worksheets("Консолидированные данные").Range("A" & LastRow) = .Name'
Источники
Место назначения
Sub RetrieveData()
Const PROC_TITLE As String = "Retrieve Data"
' Define constants.
' Source
Const SRC_FOLDER_PATH As String = "C:\Test\"
Const SRC_DIR_PATTERN As String = "*.csv"
Const SRC_TOTALS_ROW_IDENTIFIER As String = "Total"
Const SRC_TOTALS_ROW_OFFSET As Long = 1 ' 0 to copy totals row
Const SRC_FIRST_ROW As Long = 10
Const SRC_COLUMNS As String = "A:V"
' Destination
Const DST_SHEET_NAME As String = "Consolidated Data"
Const DST_FIRST_CELL_ADDRESS As String = "B2"
Const DST_SOURCE_NAME_COLUMN As String = "A"
Application.ScreenUpdating = False
' Reference the destination objects.
Dim dwb As Workbook: Set dwb = ThisWorkbook
Dim dws As Worksheet: Set dws = dwb.Sheets(DST_SHEET_NAME)
Dim dcell As Range: Set dcell = dws.Range(DST_FIRST_CELL_ADDRESS)
Dim ColumnsCount As Long: ColumnsCount = dws _
.Columns(SRC_COLUMNS).Columns.Count
Dim drrg As Range: Set drrg = dcell.Resize(, ColumnsCount)
Dim dncell As Range: Set dncell = drrg.Cells(1) _
.EntireRow.Columns(DST_SOURCE_NAME_COLUMN)
' Clear existing data.
Dim drCount As Long: drCount = dws.Rows.Count - drrg.Row + 1
drrg.Resize(drCount).ClearContents
dncell.Resize(drCount).ClearContents
' Get the source first file name.
Dim sFileName As String: sFileName = Dir(SRC_FOLDER_PATH & SRC_DIR_PATTERN)
If Len(sFileName) = 0 Then
MsgBox "No (""" & SRC_DIR_PATTERN & """) files found in """ _
& SRC_FOLDER_PATH & """!", vbExclamation
Exit Sub
End If
' For each found file, copy...
Dim swb As Workbook, sws As Worksheet, srg As Range, slCell As Range
Dim sRowsCount As Long, dRowsCount As Long, swsCount As Long
Do While Len(sFileName) > 0
Set swb = Workbooks.Open(Filename:=SRC_FOLDER_PATH & sFileName, Local:=True)
Set sws = swb.Sheets(1)
Set slCell = sws.Cells.Find(What: = "Total", LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not slCell Is Nothing Then
sRowsCount = slCell.Row - SRC_TOTALS_ROW_OFFSET - SRC_FIRST_ROW + 1
If sRowsCount > 0 Then
Set srg = sws.Rows(SRC_FIRST_ROW) _
.Resize(sRowsCount).Columns(SRC_COLUMNS)
dncell.Offset(dRowsCount).Value = swb.Name ' write workbook name
drrg.Offset(dRowsCount).Resize(sRowsCount).Value = srg.Value
dRowsCount = dRowsCount + sRowsCount
swsCount = swsCount + 1
'Else ' no data found
End If
'Else ' totals row not identified
End If
swb.Close SaveChanges:=False
sFileName = Dir ' next file
Loop
Application.ScreenUpdating = True
' Inform.
MsgBox "Retrieved " & dRowsCount & " row" _
& IIf(dRowsCount = 1, "", "s") & " of data from " _
& swsCount & " file" & IIf(swsCount = 1, "", "s") & ".", _
vbInformation, PROC_TITLE
End Sub
Привет, этот работает отлично. Спасибо за это. Хотя это намного выше моего уровня.
Эта строка является синтаксической ошибкой: у wkbSource нет свойства рабочей книги.