Добрый день, подскажите существуют ли методы или кто-то решал такую задачу. •В определенной директории (папке) лежат файлы эксель. •На основе этого, был создан документ с ссылками на каждый файл
Как можно вывести число количества строк каждого файла Эксель из списка?
Илья написал: Как можно вывести число количества строк
Написав макрос, который будет поочерёдно открывать файлы Excel в папке и согласно определению, что такое число строк в файле, будет записывать это число. Напомню, для формата 2007 года строк на листе 1048576, для формата 97-2003 чуть более 65 тысяч.
Андрей, зачем? Согласно условию задачи можно по расширению сказать максимум, а по версии в которой это работает ограничить 32767 для xls в 2003м и старше :-)
Если вы имеете ввиду кол-во строк таблицы, то на каждом листе может быть разное кол-во строк. Допустим, на Лист1 - 100 строк, на Лист2 - 1000 строк и т.д. То есть ещё нужно знать название листов, на которых вы хотите найти кол-во заполненных строк
За основу взял макрос из этой ветки Список файлов в папке Где здесь можно дописать код? В строке 52? Или как-то по-другому прописывается?
Код
Sub FileList()
Dim V As String
Dim BrowseFolder As String
'открываем диалоговое окно выбора папки
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Выберите папку или диск"
.Show
On Error Resume Next
Err.Clear
V = .SelectedItems(1)
If Err.Number <> 0 Then
MsgBox "Вы ничего не выбрали!"
Exit Sub
End If
End With
BrowseFolder = CStr(V)
'добавляем лист и выводим на него шапку таблицы
ActiveWorkbook.Sheets.Add
With Range("A1:E1")
.Font.Bold = True
.Font.Size = 12
End With
Range("A1").Value = "Имя файла"
Range("B1").Value = "Путь"
Range("C1").Value = "Кол-во"
'вызываем процедуру вывода списка файлов
'измените True на False, если не нужно выводить файлы из вложенных папок
ListFilesInFolder BrowseFolder, True
End Sub
Private Sub ListFilesInFolder(ByVal SourceFolderName As String, ByVal IncludeSubfolders As Boolean)
Dim FSO As Object
Dim SourceFolder As Object
Dim SubFolder As Object
Dim FileItem As Object
Dim r As Long
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.getfolder(SourceFolderName)
r = Range("A65536").End(xlUp).Row + 1 'находим первую пустую строку
'выводим данные по файлу
'гиперссылка
For Each FileItem In SourceFolder.Files
Cells(r, 1).Formula = FileItem.Name
Cells(r, 2).Formula = "=HYPERLINK(""" & FileItem.Path & """)"
Cells(r, 3).Formula = ?
r = r + 1
X = SourceFolder.Path
Next FileItem
'вызываем процедуру повторно для каждой вложенной папки
If IncludeSubfolders Then
For Each SubFolder In SourceFolder.SubFolders
ListFilesInFolder SubFolder.Path, True
Next SubFolder
End If
Columns("A:E").AutoFit
Set FileItem = Nothing
Set SourceFolder = Nothing
Set FSO = Nothing
End Sub
БМВ написал: Ну и я б через ADODB запрос бы сделал, но к каждому файлу
Можно. Но, пусть заполнена ячейка A1, D3, Z1000001, а ячейки X100500, R111 залиты жёлтым цветом. Сколько у нас строк в файле? Первое уточнение уже есть - книга из одного рабочего листа. Интересно, до какого номера поста дойдёт обсуждение, на котором ТС таки снизойдёт до определения, что такое строки книги?
Здравствуйте. В строке 7 написано ...Range("A1:A200")) - это примерно, лучше заменить на переменную как в сообщении №19 см. выше.
Код
'выводим данные по файлу
'гиперссылка
For Each FileItem In SourceFolder.Files
Cells(r, 1).Formula = FileItem.Name
Cells(r, 2).Formula = "=HYPERLINK(""" & FileItem.Path & """)"
Workbooks.Open FileItem.Path
Cells(r, 3).Formula = Application.WorksheetFunction.CountA(ActiveWorkbook.ActiveSheet.Range("A1:A200"))
ActiveWorkbook.Close False
r = r + 1
X = SourceFolder.Path
Next FileItem
Если что - это кусок из вашего кода начиная со строки 47
Если уже есть файлы и ссылки на них, значит есть полный путь, значит можно сообразить/собрать формулу. считающую это число (если строго следовать написанному выше условию!). Конечно если известно имя того первого листа каждого файла.
•В определенной директории (папке) лежат файлы эксель. •Каждый файл эксель имеет структуру из одного листа и заполненных ячеек •На основе этого, был создан документ с ссылками на каждый файл Как можно вывести число количества строк (например столбца А) каждого файла Эксель из списка? ------------------------------------------------------------------------------------- UPD: За основу взял макрос из этой ветки Список файлов в папке файлов в папке Где здесь можно дописать код? В строке 52? Или как-то по-другому прописывается?
Код
Sub FileList()
Dim V As String
Dim BrowseFolder As String
'открываем диалоговое окно выбора папки
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Выберите папку или диск"
.Show
On Error Resume Next
Err.Clear
V = .SelectedItems(1)
If Err.Number <> 0 Then
MsgBox "Вы ничего не выбрали!"
Exit Sub
End If
End With
BrowseFolder = CStr(V)
'добавляем лист и выводим на него шапку таблицы
ActiveWorkbook.Sheets.Add
With Range("A1:E1")
.Font.Bold = True
.Font.Size = 12
End With
Range("A1").Value = "Имя файла"
Range("B1").Value = "Путь"
Range("C1").Value = "Кол-во"
'вызываем процедуру вывода списка файлов
'измените True на False, если не нужно выводить файлы из вложенных папок
ListFilesInFolder BrowseFolder, True
End Sub
Private Sub ListFilesInFolder(ByVal SourceFolderName As String, ByVal IncludeSubfolders As Boolean)
Dim FSO As Object
Dim SourceFolder As Object
Dim SubFolder As Object
Dim FileItem As Object
Dim r As Long
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.getfolder(SourceFolderName)
r = Range("A65536").End(xlUp).Row + 1 'находим первую пустую строку
'выводим данные по файлу
'гиперссылка
For Each FileItem In SourceFolder.Files
Cells(r, 1).Formula = FileItem.Name
Cells(r, 2).Formula = "=HYPERLINK(""" & FileItem.Path & """)"
Cells(r, 3).Formula = ?
r = r + 1
X = SourceFolder.Path
Next FileItem
'вызываем процедуру повторно для каждой вложенной папки
If IncludeSubfolders Then
For Each SubFolder In SourceFolder.SubFolders
ListFilesInFolder SubFolder.Path, True
Next SubFolder
End If
Columns("A:E").AutoFit
Set FileItem = Nothing
Set SourceFolder = Nothing
Set FSO = Nothing
End Sub
Private Const baseConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$1;Extended Properties='Excel 12.0;HDR=NO;IMEX=1';"
Public Function getNotNullRowCountFromFirstColumnOfSheet(ByVal FileName As String) As Long
Dim pAdoX As Object, pConn As Object
Dim pTable As Object, pRSet As Object
Dim sheetTableName As String, vResult As Long
Set pAdoX = CreateObject("ADOX.Catalog")
Set pConn = CreateObject("ADODB.Connection")
pConn.Open Replace$(baseConnStr, "$1", FileName)
pAdoX.ActiveConnection = pConn
sheetTableName = ""
vResult = -1
For Each pTable In pAdoX.Tables
If Right$(pTable.Name, 1) = "$" Then
sheetTableName = pTable.Name
Exit For
End If
Next
If sheetTableName <> "" Then
Set pRSet = pConn.Execute("Select Count(*) As FCount From [" & sheetTableName & "] Where F1 Is Not Null")
vResult = pRSet(0).Value
pRSet.Close
End If
pConn.Close
Set pAdoX = Nothing
getNotNullRowCountFromFirstColumnOfSheet = vResult
End Function
Помним, у ADODB есть ограничения по именования файлов и листов.
New, Паша, с чего ты взял? или из названия темы и стартового сообщения было понятно, ЧТО понимать под количеством строк? Только из #16 стала понятна задача.
Илья, Вы тоже считаете, что объяснили сразу всё исчерпывающе? И искреннее желание форумчан разобраться, чтобы помочь Вам, Вы считаете троллингом? Да если бы фраза из #16 была в стартовом сообщении, то уже в первом же ответе получили бы решение...