Excel миф открыть все файлы

Хитрости »

20 Июль 2012              137469 просмотров


Просмотреть все файлы в папке

Иногда необходимо проделать однотипные операции с несколькими файлами, расположенными в одной папке. Можно открывать каждый по очереди:
Workbooks.Open «C:Новая папкаКнига1.xlsx»
Workbooks.Open «C:Новая папкаКнига2.xlsx»
и т.д.
Но если файлов много и все с разными именами, то это не очень практично и совсем лишено гибкости. При помощи Visual Basic for Application можно решить проблему. При этом файлы можно просматривать как в одной папке, так и включая вложенные «подпапки».

  • Все файлы в папке
  • Все файлы включая подпапки
  • Просмотреть все диски

 
Все файлы в папке

Ниже приведен код, который перебирает все файлы в папке, открывает их и на первом листе каждого файла записывает текст

«www.excel-vba.ru»

в ячейку

A1

:

Sub Get_All_File_from_Folder()
    Dim sFolder As String, sFiles As String
    Dim wb As Workbook
    'диалог запроса выбора папки с файлами
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    'отключаем обновление экрана, чтобы наши действия не мелькали
    Application.ScreenUpdating = False
    sFiles = Dir(sFolder & "*.xls*")
    Do While sFiles <> ""
        'открываем книгу
        Set wb = Application.Workbooks.Open(sFolder & sFiles)
        'действия с файлом
        'Запишем на первый лист книги в ячейку А1 - www.excel-vba.ru
        wb.Sheets(1).Range("A1").Value = "www.excel-vba.ru"
        'Закрываем книгу с сохранением изменений
        wb.Close True 'если поставить False - книга будет закрыта без сохранения
        sFiles = Dir
    Loop
    'возвращаем ранее отключенное обновление экрана
    Application.ScreenUpdating = True
End Sub

sFiles = Dir(sFolder & «*.xls*») — Строка отвечает за тип перебираемых файлов. В примере будут просмотрены любые файлы Excel. Звездочка на конце означает любой символ или набор символов. Т.е. если указать без неё — «*.xls», то будут просмотрены только файлы с расширением xls, а если указать xlsx — то файлы с расширением xlsx и никакие другие.
Если хотите перебрать файлы других форматов, а не Excel, то просто замените «*.xls» на нужное расширение. Например «*.doc». Также, если хотите собрать только файлы с определенными символами/словами в имени, то можно указать так: sFiles = Dir(sFolder & «*отчет*.xls*»). Будут просмотрены все файлы, содержащие в имени слово «отчет»(например «отчет за июнь.xls», «отчет за июль.xls», «сводный отчет.xls» и т.п.).


 
Все файлы включая подпапки

В коде выше есть одна проблема: что если необходимо открыть файлы не только в указанной папке, но и во всех её подпапках? В версиях Excel 2003 и младше это решалось с помощью метода

.FileSearch

, но в старших версиях данный метод по каким-то причинам был заблокирован разработчиками Microsoft. И осталось действовать только через рекурсивный метод перебора папок. Ниже приведен код, который открывает все файлы Excel в указанной папке, включая все подпапки.
Для этого используется встроенная в офис библиотека

File System Object

:

Option Explicit
 
Dim objFSO As Object, objFolder As Object, objFile As Object
 
Sub Get_All_File_from_SubFolders()
    Dim sFolder As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    Application.ScreenUpdating = False
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    GetSubFolders sFolder
    Set objFolder = Nothing
    Set objFSO = Nothing
    Application.ScreenUpdating = True
End Sub
Private Sub GetSubFolders(sPath)
    Dim sPathSeparator As String, sObjName As String
    Dim wb As Workbook
    Set objFolder = objFSO.GetFolder(sPath)
    For Each objFile In objFolder.Files
        If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".xls*" Then
            'открываем книгу
            Set wb = Application.Workbooks.Open(sPath & objFile.Name)
            'действия с файлом
            'Запишем на первый лист книги в ячейку А1 - www.excel-vba.ru
            wb.Sheets(1).Range("A1").Value = "www.excel-vba.ru"
            wb.Close True 'wb.Close False '- если в коде надо будет закрывать книгу без сохранения
        End If
    Next
    For Each objFolder In objFolder.SubFolders
        GetSubFolders objFolder.Path & Application.PathSeparator
    Next
End Sub

Код делает тоже самое, что и первый, но открывает и изменяет ячейку A1 первого листа для всех файлов Excel в выбранной папке и всех её подпапках(включая все вложенные до последнего уровня).

If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".xls*" Then

Строка отвечает за тип перебираемых файлов. В примере будут просмотрены любые файлы Excel. Звездочка на конце означает любой символ или набор символов. Т.е. если указать без неё — «*.xls», то будут просмотрены только файлы с расширением xls, а если указать xlsx — то файлы с расширением xlsx и никакие другие.
Если добавить условие: If objFSO.GetBaseName(objFile) Like «*книга*» Then
то будут обработаны файлы, которые в имени содержат слово «книга». При этом регистр букв имеет значение. Т.е. если файл содержит в имени слово «Книга», то он не будет обработан.
Думаю теперь Вы легко сможете проделать необходимые операции с множеством файлов.

Скачать пример:

  Все файлы в папке и подпапках.xls (61,5 KiB, 8 202 скачиваний)

В примере я закомментировал строки, открывающие файл и вносящие изменения в ячейку

A1

и заменил это созданием списка имен всех файлов в папках и подпапках. По окончании работы кода имена всех файлов записываются в столбец «А» нового листа(лист создается автоматически). Сделано для того, чтобы при тестировании кода случайно не повредить информацию в файлах.


 
Просмотреть все файлы на всех дисках

В последнее время участились вопросы как просмотреть еще и все диски на ПК. Ниже выкладываю код, который просматривает все подключенные диски и просматривает все файлы во всех папках дисков:

Sub Get_All_drives()
    Dim objDrives As Object, objDrive As Object
 
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objDrives = objFSO.Drives
    For Each objDrive In objDrives
        If objDrive.IsReady Then
            GetSubFolders objDrive.DriveLetter & ":"
        End If
    Next objDrive
End Sub

Для работы кода необходимо разместить его в том же модуле, что и код просмотра файлов в подпапках. Без него код просмотра дисков работать не будет, т.к. обращается к процедуре GetSubFolders(которая и приведена в коде перебора файлов в подпапках).
Скачать пример:

  Все файлы в папке и подпапках.xls (61,5 KiB, 8 202 скачиваний)

В примере код сканирует все диски и выводит в столбец А нового листа(лист создается автоматически) пути ко всем файлам.

Так же см.:
Как средствами VBA переименовать/переместить/скопировать файл
Как сменить формат сразу для нескольких файлов Excel
Как удалить папку или все файлы из папки через VBA
Собрать и просуммировать данные из разных файлов при помощи PowerQuery


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Хитрости »

17 Июнь 2015              147338 просмотров


Диалоговое окно выбора файлов/папки

Часто при работе с файлами и написании кодов начинающие «кодить» в VBA сталкиваются с необходимостью предоставить пользователю возможность самостоятельного выбора файлов: либо всех в указанной папке, либо каких-то отдельных. Конечно, можно жестко в коде написать нечто вроде: «C:DocumentsFilesКнига1.xls», но это требует не только наличия именно диска С, но и полной структуры папок и имен файлов. Это очень неудобно в большинстве случаев и куда чаще необходимо дать пользователю возможность самому указать имя файла. Записывать в ячейку листа полный путь и имя весьма непрактично и часто для неискушенного пользователя вызывает только «отторжение» от программы. В статье Просмотреть все файлы в папке я приводил пример кода, который просматривает все файлы в указанной папке и папка при этом выбирается сами пользователем из привычного по работе с Windows диалога. Там используется диалог выбора папок. Именно на этом я и хочу сделать акцент в этой статье — рассказать про некоторые способы вызова подобных диалогов для выбора файлов или папки. Так же обращу внимание на некоторые вещи, которые следует учитывать при использовании того или иного типа диалогов.

  • Диалог выбора файлов Applicaton.GetOpenFileName
  • Диалог выбора файлов FileDialog(msoFileDialogFilePicker)
  • Диалог выбора папки FileDialog(msoFileDialogFolderPicker)
  • Диалог выбора папки через Shell
  • Диалог сохранения файла SaveAs

Если рассматривать наиболее простые варианты, то их два. Выбрать файлы можно через Applicaton.GetOpenFileName или через Application.FileDialog. Отличия в них есть, но я заострю внимание на главном: GetOpenFileName будет работать в любой версии Excel, а класс FileDialog только начиная с Excel 2002, т.к. именно в этой версии впервые был использован класс FileDialog. Это стоит учитывать при разработке.

Диалог выбора файлов Applicaton.GetOpenFileName

Параметры:

Application.GetOpenFilename([FileFilter], [FilterIndex], [Title], [ButtonText], [MultiSelect])
По сути я часто использую именно его, т.к. это универсальный метод и в нем есть все, что лично мне необходимо: выбрать определенные типы файлов позволяет, возможность запрета выбора нескольких файлов сразу есть.

FileFilter Указываются типы файлов, которые будут отображаться в диалоговом окне выбора. Например, если указать «Excel files(*.xls*),*.xls*», то возможно будет выбрать только файлы Excel(с расширением, начинающимся на .xls — .xls, .xlsx, .xlsb, .xlsm и т.д.). Если указать «Text files(*.txt),*.txt», то можно будет выбрать только текстовые файлы с расширением .txt. Так же можно указать более одного типа расширений: «Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt». По умолчанию тип файлов в диалоговом окне будет принадлежать первому указанному типу файлов(*.xls*). Но можно указать любой из перечисленных типов при помощи аргумента FilterIndex. Так же можно указать выбор любых типов файлов: «All files(*.*),*.*»
FilterIndex Если аргументом FileFilter указано более одного типа файлов(расширений), то этот аргумент указывает какой именно тип использовать. Например, следующая строка по умолчанию назначает выбор текстовых типов файлов:

avFiles = Application.GetOpenFilename _
    ("Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", 2, _
     "Выбрать текстовые или Excel файлы", , True)

Атрибут FilterIndex

Title Текст заголовка диалогового окна. Если указать «Выбрать текстовые или Excel файлы», то именно этот текст будет в заголовке. Если не указывать, то будет текст по умолчанию(нечто вроде «Открытие документа»)
ButtonText Данный аргумент доступен только для ПК под управлением Macintosh(MAC). Назначает текст для кнопки диалогового окна Открыть. Для владельцев Windows этот текст всегда будет «Открыть»
MultiSelect Указывает, может быть выбран только один файл или несколько:

  • True — можно будет выбрать более одного файла для обработки(через Shift или Ctrl или простым выделением мышью внутри окна)
  • False — можно будет выбрать только один файл

По умолчанию принимает значение False
Выбора только одного файла:

avFiles = Application.GetOpenFilename _
    ("Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", 2, _
     "Выбрать текстовые или Excel файлы", , False)

Выбор нескольких файлов:

avFiles = Application.GetOpenFilename _
    ("Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", 2, _
     "Выбрать текстовые или Excel файлы", , True)

Пример применения диалога Application.GetOpenFilename

Sub ShowGetOpenDialod()
    Dim avFiles
    'по умолчанию к выбору доступны файлы Excel(xls,xlsx,xlsm,xlsb)
    avFiles = Application.GetOpenFilename _
                ("Excel files(*.xls*),*.xls*", 1, "Выбрать Excel файлы", , False)
    If VarType(avFiles) = vbBoolean Then
        'была нажата кнопка отмены - выход из процедуры
        Exit Sub
    End If
    'avFiles - примет тип String
    MsgBox "Выбран файл: '" & avFiles & "'", vbInformation, "www.excel-vba.ru"
End Sub

В данном случае совершенно неважно указан ли выбор только одного файла или нескольких. Может поменяться только способ обработки полученного результата. Если параметр MultiSelect установлен в False, то переменная avFiles примет тип String, т.е. это будет одна строка. Предположим, что была выбрана книга Excel. Тогда открыть её можно будет как обычно это делается при использовании переменной:

Если же параметр MultiSelect установлен в True, то переменная avFiles примет тип Array — массив строк, в котором будут записаны все пути и имена выбранных файлов. Обрабатывать в таком случае следует циклом:

'avFiles - примет тип Array
    For Each x In avFiles
        Workbooks.Open x
    Next

В приложенном к статье файле приведены две процедуры с использованием этого типа диалога и обработкой файлов с параметром MultiSelect, установленным в True и False.


 
Диалог выбора файлов FileDialog(msoFileDialogFilePicker)

У этого диалога тоже есть параметры и они очень схожи с таковыми в Application.GetOpenFilename:
Ниже в статье примера кода с применением всех описанных параметров

AllowMultiSelect Указывает, может быть выбран только один файл или несколько:

  • True — можно будет выбрать более одного файла для обработки(через Shift или Ctrl или простым выделением мышью внутри окна)
  • False — можно будет выбрать только один файл
Title Текст заголовка диалогового окна. Если указать «Выбрать текстовые или Excel файлы», то именно этот текст будет в заголовке. Если не указывать, то будет текст по умолчанию(нечто вроде «Открытие документа»)
Filters Перечисляются типы файлов, которые будут отображаться в диалоговом окне выбора. Для добавления типа файла(расширения) необходимо использовать метод Add:
.Filters.Add([Description],[Extensions],[Position])

  • Description — описание типа файлов. Произвольный текст, указывающий тип файлов. Например «Рисунки» или «Файлы Excel».
  • Extensions — расширения файлов. Непосредственно перед расширением обязательно должна стоять звездочка и точка: *.xls. Иначе диалог выдаст ошибку. Для перечисления нескольких расширений используется разделитель в виде точки-с-запятой: «*.xls*;*.xla*» или «*.xls;*.xlsx;*.xlsm». Звездочка после расширения заменяет любой набор символов или ни одного. Например, при указании «*.xls*» будет возможным выбрать любые файлы, расширение которых начинается на .xls: .xls,.xlsx,.xlsm,.xlsb и т.д., но нельзя будет выбрать файлы с расширением .xla,.xlam и тем более .doc или .txt. Если необходимо осуществить выбор любого типа файлов, то необходимо просто очистить фильтр и не добавлять никакие типы: .Filters.Clear
  • Position — указывает, каким по счету в списке будет тип файлов. На рисунке ниже первым идет тип «Excel files», а вторым «Text files»:
    Атрибут FilterIndex
  • Тип файлов, который будет показан по умолчанию при вызове диалога определяется свойством FilterIndex диалога FileDialog.
    Важный момент: диалог, вызванный в одном сеансе Excel сохраняет добавленные ранее типы файлов. Поэтому перед назначением новых типов необходимо выполнить очистку фильтра:
    .Filters.Clear

Каждый новый тип файлов добавляется новым Add:

.Filters.Add "Excel files", "*.xls*;*.xla*", 1 'добавляем возможность выбора файлов Excel
.Filters.Add "Text files", "*.txt", 2 'добавляем возможность выбора текстовых файлов
FilterIndex Назначает тип файлов, который будет выбран по умолчанию из всех перечисленных в коллекции Filters при вызове диалога
InitialFileName Этим параметром можно задать начальную папку, на которой будет открыт диалог:

.InitialFileName = "С:Temp"

Если при этом еще добавить имя файла, то в поле диалога Имя файла будет так же отображено это имя:

.InitialFileName = "С:TempКнига1.xlsx"

Я лично не рекомендую указывать имя файла, т.к. после показа диалога этот файл автоматически будет выбран, что не всегда бывает правильным. Но все зависит от задач. Если пользователь не выберет самостоятельно ни одного файла, то ответом диалога будет именно файл с указанным именем(Книга1.xlsx). Если такого файла не окажется в папке, то диалог выдаст предупреждение, что такого файла нет.

InitialView Данный параметр определяет внешний вид и структуру окна диалога. Доступно 9 вариантов:

  • msoFileDialogViewDetails
  • msoFileDialogViewLargeIcons
  • msoFileDialogViewList
  • msoFileDialogViewPreview
  • msoFileDialogViewProperties
  • msoFileDialogViewSmallIcons
  • msoFileDialogViewThumbnail
  • msoFileDialogViewTiles
  • msoFileDialogViewWebView

При использовании данного параметра следует учитывать, что на разных операционных системах могут быть доступны не все варианты. Поэтому прежде чем использовать лучше убедиться, что на конечных ПК поддерживается указанный тип. В принципе ничего страшного не произойдет — будет просто показано окно с видом по умолчанию. Но куда правильнее в разработке придерживаться однотипного вида на всех ПК.

SelectedItems Возвращает коллекцию выбранных файлов. В отличии от Application.GetOpenFilename всегда возвращается массив строк, поэтому можно всегда использовать цикл для открытия файлов, даже если параметр AllowMultiSelect установлен в False:

For Each x In .SelectedItems
    Workbooks.Open x
Next

Так же можно отбирать только отдельные файлы по индексам или организовать цикл иначе:

For lf = 1 to .SelectedItems.Count
    x = .SelectedItems(lf)
    Workbooks.Open x
Next

Нумерация строк в SelectedItems всегда начинается с 1

Show Пожалуй, самый важный метод в диалоге — отвечает за показ диалога. При этом метод Show возвращает ответ в виде целого числа:

  • -1 — выбор файлов был сделан и нажата кнопка Открыть
  • 0 — была нажата кнопка отмены

Это можно(точнее нужно!) использовать, чтобы не продолжать выполнение кода, если нажата кнопка Отмены:

If .Show = 0 Then Exit Sub 'была нажата кнопка отмены

Пример вызова диалога выбора файлов:

Sub ShowFileDialog()
    Dim oFD As FileDialog
    Dim x, lf As Long
    'назначаем переменной ссылку на экземпляр диалога
    Set oFD = Application.FileDialog(msoFileDialogFilePicker)
    With oFD 'используем короткое обращение к объекту
    'так же можно без oFD
    'With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Title = "Выбрать файлы отчетов" 'заголовок окна диалога
        .Filters.Clear 'очищаем установленные ранее типы файлов
        .Filters.Add "Excel files", "*.xls*;*.xla*", 1 'устанавливаем возможность выбора только файлов Excel
        .Filters.Add "Text files", "*.txt", 2 'добавляем возможность выбора текстовых файлов
        .FilterIndex = 2 'устанавливаем тип файлов по умолчанию - Text files(Текстовые файлы)
        .InitialFileName = "С:TempКнига1.xlsx" 'назначаем папку отображения и имя файла по умолчанию
        .InitialView = msoFileDialogViewDetails 'вид диалогового окна(доступно 9 вариантов)
        If .Show = 0 Then Exit Sub 'показывает диалог
        'цикл по коллекции выбранных в диалоге файлов
        For lf = 1 To .SelectedItems.Count
            x = .SelectedItems(lf) 'считываем полный путь к файлу
            Workbooks.Open x 'открытие книги
            'можно также без х
            'Workbooks.Open .SelectedItems(lf)
        Next
    End With
End Sub

 
Диалог выбора папки

Диалог выбора папки необходим в случаях, когда файлов в папке много и обработать нужно все эти файлы. Пример такой обработки я уже выкладывал в статье Просмотреть все файлы в папке. Здесь проще всего использовать появившийся в 2002 Excel диалог Application.FileDialog. Его параметры практически такие же, как у Application.FileDialog(msoFileDialogFilePicker) только их меньше доступно для применения:

Title Текст заголовка диалогового окна. Если указать «Выбрать папку с отчетами», то именно этот текст будет в заголовке. Если не указывать, то будет текст по умолчанию(нечто вроде «Открыть папку»)
InitialFileName Этим параметром можно задать начальную папку, на которой будет открыт диалог:

.InitialFileName = "С:Temp"
InitialView Данный параметр определяет внешний вид и структуру окна диалога. Доступно 9 вариантов:

  • msoFileDialogViewDetails
  • msoFileDialogViewLargeIcons
  • msoFileDialogViewList
  • msoFileDialogViewPreview
  • msoFileDialogViewProperties
  • msoFileDialogViewSmallIcons
  • msoFileDialogViewThumbnail
  • msoFileDialogViewTiles
  • msoFileDialogViewWebView

При использовании данного параметра следует учитывать, что на разных операционных системах могут быть доступны не все варианты. Поэтому прежде чем использовать лучше убедиться, что на конечных ПК поддерживается указанный тип. В принципе ничего страшного не произойдет — будет просто показано окно с видом по умолчанию. Но куда правильнее в разработке придерживаться однотипного вида на всех ПК.

SelectedItems Возвращает коллекцию с одним элементом, в котором содержится путь к выбранной папке. Нумерация строк в SelectedItems всегда начинается с 1, но т.к. выбор нескольких папок невозможен, то всегда указывается 1: x = .SelectedItems(1)
ButtonName Назначает текст кнопки, которой подтверждается выбор папки. Может содержать не более 51 знака(чего как правило достаточно).
Show Метод, который вызывает показ диалога с выбранными параметрами. Возвращает ответ в виде целого числа:

  • -1 — папка выбрана и нажата кнопка Открыть
  • 0 — была нажата кнопка отмены

Это можно(точнее нужно!) использовать, чтобы не продолжать выполнение кода, если нажата кнопка Отмены:

If .Show = 0 Then Exit Sub 'была нажата кнопка отмены

Пример вызова диалога выбора папки:

Sub ShowFolderDialog()
    Dim oFD As FileDialog
    Dim x, lf As Long
    'назначаем переменной ссылку на экземпляр диалога
    Set oFD = Application.FileDialog(msoFileDialogFolderPicker)
    With oFD 'используем короткое обращение к объекту
    'так же можно без oFD
    'With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Выбрать папку с отчетами" '"заголовок окна диалога
        .ButtonName = "Выбрать папку"
        .Filters.Clear 'очищаем установленные ранее типы файлов
        .InitialFileName = "C:Temp" '"назначаем первую папку отображения
        .InitialView = msoFileDialogViewLargeIcons 'вид диалогового окна(доступно 9 вариантов)
        If .Show = 0 Then Exit Sub 'показывает диалог
        'цикл по коллекции выбранных в диалоге файлов
        x = .SelectedItems(1) 'считываем путь к папке
        MsgBox "Выбрана папка: '" & x & "'", vbInformation, "www.excel-vba.ru"
    End With
End Sub

 
Диалог выбора папки через Shell

Диалог Application.FileDialog(msoFileDialogFolderPicker) всем хорош и удобен, кроме одного: как я уже упоминал, он стал доступен из VBA только начиная с 2002 Excel. Плюс, описанные выше диалоги не работают в Outlook — он просто лишен хоть какой-либо реализации выбора папок или файлов. Поэтому дополню статью еще одним вариантом показа диалога выбора папки — с помощью объекта Shell. Этот вариант выбора папки будет работать и в Outlook и в любом другом приложении.

Shell.BrowseForFolder([Hwnd], [sTitle], [iOptions], [vRootFolder])

Hwnd Дескриптор окна, к которому будет относится диалог. Как правило указывается 0
sTitle Поясняющий текст, который будет отображен в диалоге. Подобие заголовка окна. Может быть любым текстом, например «Выбрать папку с отчетами»
iOptions Дополнительные параметры для диалога. Рекомендуется использовать 0. Но можно попробовать и пару других вариантов. Например, если указать 20, то в диалоговом окне появится дополнительное текстовое поле, в котором будет отображено имя выбранной папки.
vRootFolder Аналогично InitialFileName в рассмотренных выше диалогах. Задает начальную папку, на которой диалог будет открыт после запуска.

Диалог выбора папки - Shell
Пример вызова диалога выбора папки через Shell:

Sub GetFolderDialog_Shell()
    On Error Resume Next
    Dim objShellApp As Object, objFolder As Object, ulFlags
    Dim x As String
    Set objShellApp = CreateObject("Shell.Application")
    'ulFlags - числовой код, определяющий вид отображаемого окна и некоторые параметры
    '    ulFlags = 0     - наиболее часто применяемый. Лучше использовать всегда именно 0
    '    ulFlags = 1     - не отображать Корзину
    '    ulFlags = 2     - не включать сетевые папки
    '    ulFlags = 20    - добавляется тестовое поле с отображением имени выбранной папки
    '    ulFlags = 16    - отображать EditBox для ввода полного пути с клавиатуры
    '    ulFlags = 16384 - можно так же выбирать файлы.
    'Некоторые константы можно комбинировать. Например если указать 1 + 16384 - то можно будет выбирать файлы
 
    ulFlags = 0
    Set objFolder = objShellApp.BrowseForFolder(0, "Выбрать папку с отчетами", ulFlags, "C:Temp")'"
    x = objFolder.Self.Path 'записываем в переменную путь к папке
    If Err.Number <> 0 Then
        MsgBox "Папка не выбрана!", vbInformation, "www.excel-vba.ru"
    Else
        MsgBox "Выбрана папка: '" & x & "'", vbInformation, "www.excel-vba.ru"
    End If
End Sub

Конечно, диалог подобный выглядит довольно убого, особенно на современных операционных системах. Но он работает в любых версиях офиса и в любом приложении, в том числе в Outlook. Порой это бывает полезней красоты.

Скачать пример:

  Tips_Macro_GetOpenFileFolder.xls (100,0 KiB, 3 740 скачиваний)


 
Диалог сохранения файла SaveAs

Еще один вид диалогового окна — запрос имени и места сохранения файла.
Параметры:

Application.GetSaveAsFilename([InitialFileName], [FileFilter], [FilterIndex], [Title], [ButtonText])
Универсальный диалог, работающий во всех версиях Excel, начиная с 2000

InitialFileName Можно указать путь и имя файла, которые будут использованы в качестве шаблона для сохранения. По умолчанию в диалоге отображается папка, которая была использована в последний раз в текущем сеансе Excel. Если диалог вызывается впервые, то будет показана для сохранения файлов по умолчанию(задается из самого Excel: Файл(File)Параметры(Options)Сохранение(Save)Расположение локальных файлов по умолчанию(Default local file location)).
Показываем диалог со стартовой папкой на той книге, в которой сам макрос, без указания имени сохраняемой книги:

sToSavePath = Application.GetSaveAsFilename(InitialFileName:=ThisWorkbook.Path)

Показываем диалог со стартовой папкой на той книге, в которой сам макрос и именем сохраняемой книги «SaveAs.xlsm»:

sToSavePath = Application.GetSaveAsFilename(InitialFileName:="SaveAs.xlsm", FileFilter:="Excel files (*.xlsm), *.xlsm")

Здесь следует обратить внимание на один важный момент: если необходимо помимо стартовой папки указать еще и имя файла, то в обязательном порядке надо указывать так же аргумент FileFilter. Если его не указывать, то InitialFileName просто откроет указанную папку, т.к. не поймет файлы какого типа надо отображать. Либо вместо «SaveAs.xlsm» надо будет указывать «SaveAs.*», что я лично настоятельно не рекомендую делать.
Несмотря на возможность указать имя файла его можно изменить прямо в диалоговом окне, что тоже порой правильнее. Например, чтобы убедиться в том, что имя файла указано пользователем.

FileFilter Указываются типы файлов, которые будут отображаться в диалоговом окне выбора. Должен совпадать с тем типом, с которым собираемся сохранять файл. Например, если указать «Excel files(*.xls*),*.xls*», то возможно будет выбрать только тип файлов Excel(с расширением, начинающимся на .xls — .xls, .xlsx, .xlsb, .xlsm и т.д.). Если указать «Text files(*.txt),*.txt», то только текстовые файлы с расширением .txt. Так же можно указать более одного типа расширений: «Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt». По умолчанию тип файлов в диалоговом окне будет принадлежать первому указанному типу файлов(*.xls*). Но можно указать любой из перечисленных типов при помощи аргумента FilterIndex. Так же можно указать выбор любых типов файлов: «All files(*.*),*.*»
FilterIndex Если аргументом FileFilter указано более одного типа файлов(расширений), то этот аргумент указывает какой именно тип использовать. Например, следующая строка по умолчанию назначает выбор и сохранение файла в текстовый:

avFiles = Application.GetSaveAsFilename _
    (InitialFileName:=ThisWorkbook.Path, FileFilter:="Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", FilterIndex:=2)

Атрибут FilterIndex

Title Текст заголовка диалогового окна. Если указать «Выбрать текстовые или Excel файлы», то именно этот текст будет в заголовке. Если не указывать, то будет текст по умолчанию(нечто вроде «Сохранение документа»)
ButtonText Данный аргумент доступен только для ПК под управлением Macintosh(MAC). Назначает текст для кнопки диалогового окна Сохранить. Для владельцев Windows этот текст всегда будет «Сохранить»

Что еще важно знать: сам по себе вызов диалога GetSaveAsFilename ничего не сохраняет — он только создает путь для сохраняемого файла. Сохранять придется принудительно после выбора места и имени.
Пример применения диалога Application.GetSaveAsFilename

Sub ShowGetSaveAsDialod()
    Dim sToSavePath
    sToSavePath = Application.GetSaveAsFilename( _
             InitialFileName:=ThisWorkbook.Path, _
             FileFilter:="Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", _
             FilterIndex:=2, _
             Title:="Сохранить файл")
    'если нажали Отмена - завершаем процедуру ничего не сохраняя
    If VarType(sToSavePath) = vbBoolean Then
        Exit Sub
    End If
    'непосредственно сохранение файла
    ThisWorkbook.SaveAs Filename:=sToSavePath, FileFormat:=ThisWorkbook.FileFormat
End Sub

Здесь тоже есть нюанс — метод SaveAs имеет два важных аргумента:
1. Filename — путь и имя сохраняемого файла. Здесь должно быть все понятно. Указываем то, что выбрали в диалоге.
2. FileFormat — формат сохраняемого файла. При этом не текстовое представление(как в диалоге «xls» или «txt»), а одна из предустановленных констант формата файла. Вот основные константы:

Константа Excel Числовая константа Расшифровка
xlOpenXMLWorkbookMacroEnabled 51 xlsm — книга Excel
xlOpenXMLWorkbookMacroEnabled 52 xlsm — книга Excel с поддержкой макросов
xlExcel12 50 xlsb — двоичная книга Excel (с поддержкой макросов)
xlOpenXMLAddIn 55 xlam — надстройка Excel
xlOpenXMLTemplate 54 xltx — шаблон Excel
xlOpenXMLTemplateMacroEnabled 53 xltm — шаблон Excel с поддержкой макросов
xlExcel8 56 xls — книга Excel(97 — 2003)
xlAddIn 18 xla — надстройка Excel(97 — 2003)
xlTemplate 17 xlt — шаблон Excel(97 — 2003)
xlCurrentPlatformText -4158 txt — текстовый файл с разделителями табуляции
xlUnicodeText 42 txt — текстовый файл в кодировке Юникод
xlCSV 6 csv — CSV(разделитель запятая)
xlCSVMSDOS 24 csv — CSV(MS — DOS)
XlFileFormat 62 csv — CSV UTF-8(разделитель запятая)
xlTypePDF 0 pdf — файл в формате PDF

Пример использования констант в диалогах Application.GetSaveAsFilename
Сохраняем файл с форматом xlsm — файл с поддержкой макросов. Для этого ищем в таблице выше расширение xlsm и берем либо константу Excel либо числовую константу:

Sub ShowGetSaveAsDialod()
    Dim sToSavePath
    sToSavePath = Application.GetSaveAsFilename( _
             InitialFileName:=ThisWorkbook.Path & "Report.xlsm", _
             FileFilter:="Excel files(*.xlsm),*.xlsm")
    'если нажали Отмена - завершаем процедуру ничего не сохраняя
    If VarType(sToSavePath) = vbBoolean Then
        Exit Sub
    End If
    'непосредственно сохранение файла
    'используем встроенную константу Excel
    ThisWorkbook.SaveAs Filename:=sToSavePath, FileFormat:=xlOpenXMLWorkbookMacroEnabled
    'используем числовую константу
    'ThisWorkbook.SaveAs Filename:=sToSavePath, FileFormat:=52
End Sub

Любой метод: либо числовая константа, либо встроенная работают одинаково. Вопрос лишь в том, что лично для Вас будет удобнее и нагляднее.

Так же см.:
Работа с диалогами
Как запретить сообщения?


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

nt_dmn

0 / 0 / 0

Регистрация: 28.04.2011

Сообщений: 60

1

Открытие по очереди всех файлов из каталога

04.10.2011, 17:07. Показов 26239. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте, подскажите как правильно написать строку Application.Workbooks.Open («c:Âõîäÿùèå3.xls»), что бы в имени файла была переменная. В моем случае s
Суть в том что бы открыть все файлы из каталога по очереди.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub êîë_âõ()
 Dim s As String
 Dim n As Integer
 s = Dir("c:Âõîäÿùèå*.xls")
 Application.Workbooks.Open ("c:Âõîäÿùèå3.xls")
 n = 0
 Debug.Print s
 Do While s <> ""
   s = Dir
   n = n + 1
   Debug.Print s
   Application.Workbooks.Open ("c:Âõîäÿùèå3.xls")
 Loop
 Debug.Print n
End Sub



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

04.10.2011, 17:35

2

Если номера идут по очереди, без пропусков, то так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub кол_вх()
Dim s As String
Dim n As Integer
n = 0
Do
    s = "c:Входящие" & n & ".xls"
    Debug.Print s
    If Dir(s) = "" Then Exit Do
    With Workbooks.Open(s)
        'действия с книгой
        .Close
    End With
    n = n + 1
Loop
Debug.Print n
End Sub

Добавлено через 4 минуты
А лучше так

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub кол_вх()
Dim s As String
Dim n As Integer
For n = 0 To 9999
    s = "c:Входящие" & n & ".xls"
    Debug.Print s
    If Dir(s) = "" Then Exit For
    With Workbooks.Open(s)
        'действия с книгой
        .Close
    End With
Next
Debug.Print n
End Sub



2



0 / 0 / 0

Регистрация: 28.04.2011

Сообщений: 60

04.10.2011, 17:37

 [ТС]

3

Спасибо!
Но имена файлов будут не числовые, точнее могут быть какие угодно (там ФИО будет писаться)… поэтому и выбрал свой способ….



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

04.10.2011, 18:00

4

Тогда еше проще.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub кол_вх()
Dim s As String, fldr As String
fldr = "c:Входящие"
s = Dir(fldr & "*.xls")
Do While s <> ""
    With Workbooks.Open(fldr & s)
        'действия с книгой
        .Close
    End With
    s = Dir
Loop
End Sub



1



nt_dmn

0 / 0 / 0

Регистрация: 28.04.2011

Сообщений: 60

04.10.2011, 19:03

 [ТС]

5

Сейчас попробую

Добавлено через 8 минут
Спасибо! Всё работает!
…я просто совсем новичок, точнее кроме школьного курса программирования ничего не было, а теперь прижало, надо сделать для уменьшения своих трудозатрат!
Спасибо что помогаете таким как мы

Добавлено через 46 минут
А ещё маленький вопросик:
как написать

Visual Basic
1
.Close

что бы документ закрывался без сохранения? Спасибо!



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

04.10.2011, 21:39

6

Можно открыть файл для чтения (на всякий случай) и закрыть без сохранения:

Visual Basic
1
2
3
4
    With Workbooks.Open(fldr & s, Readonly:=True)
        'действия с книгой
        .Close 0
    End With

Добавлено через 4 минуты
Кстати, вот что: Dir отслеживает только первые 3 символа расширения. То есть по маске *.xls будут найдены файлы *.xlsx, *.xlsm. Иногда это полезно, иногда нет.



2



0 / 0 / 0

Регистрация: 28.04.2011

Сообщений: 60

05.10.2011, 10:19

 [ТС]

7

Спасибо огромное!



0



NikolayHAOS

-3 / 2 / 0

Регистрация: 29.10.2013

Сообщений: 178

08.10.2017, 11:02

8

Казанский,
А как измениться макрос если нужно открыть файлы по маске.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub кол_вх()
Dim s As String, fldr As String
fldr = "c:Входящие"
s = Dir(fldr & "*.xls")
Do While s <> ""
    With Workbooks.Open(fldr & s)
        'действия с книгой
        .Close
    End With
    s = Dir
Loop
End Sub

Нужно отрыть файлы содержащие в названии символ №
Запись s = Dir(fldr & «*№*.xls») не сработала.

Добавлено через 23 минуты
Использовал другой код.
Там работает и выбор каталога есть.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub Get_All_File_from_Folder()
    Dim sFolder As String, sFiles As String
    'диалог запроса выбора папки с файлами
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    'отключаем обновление экрана, чтобы наши действия не мелькали
    Application.ScreenUpdating = False
    sFiles = Dir(sFolder & "*№*.xlsm")
    Do While sFiles <> ""
        'открываем книгу
        Workbooks.Open sFolder & sFiles
        'действия с файлом
        'Запишем на первый лист книги в ячейку А1 - www.excel-vba.ru
        ActiveWorkbook.Sheets(1).Range("A1").Value = "www.excel-vba.ru"
        'Закрываем книгу с сохранением изменений
        ActiveWorkbook.Close False 'если поставить False - книга будет закрыта без сохранения
        sFiles = Dir
    Loop
    'возвращаем ранее отключенное обновление экрана
    Application.ScreenUpdating = True
End Sub



0



 

Друзья, добрый день.

Помогите пожалуйста доработать макрос.

На текущий момент он работает неправильно.

Задача следующая:

1. Необходимо по очереди открыть все файлы в папке с разрешением html. В папке будет много файлов с разными названиями

2. Скопировать содержимое каждого отдельного файла html

3. Создать вкладку в файле «Макрос» и вставить содержимое html в отдельную вкладку

3. Закрыть файлы с разрешением html.

Прикрепленные файлы

  • Тест.zip (179.39 КБ)

Изменено: Maksimelyan05.08.2018 08:09:29

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

См. вариант: макрос.
Используйте свою папку с файлами html!

Изменено: Мотя05.08.2018 22:14:10

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#3

05.08.2018 20:49:37

Код
Sub Макрос1()
    Dim sFolder As String, sFiles As String, wb As Workbook
    'диалог запроса выбора папки с файлами
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    'отключаем обновление экрана, чтобы наши действия не мелькали
    Application.ScreenUpdating = False
    'отключаю появление всплывающего окна
    Application.DisplayAlerts = False
    sFiles = Dir(sFolder & "*.html*")
    Do While sFiles <> ""
        'открываем книгу
        Set wb = Workbooks.Open(sFolder & sFiles)
        wb.Sheets(1).Copy after:=ThisWorkbook.Sheets(Sheets.Count)
        wb.Close False
        sFiles = Dir
    Loop
    'возвращаем ранее отключенное обновление экрана
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
 

RAN,Спасибо,супер  Ваш вариант работает. Небольшое уточнение, а можно сделать так чтоб информация копировалась как значения?

 

Мотя, у меня выдаёт ошибку. НАзвание папки имеет значение?

Прикрепленные файлы

  • 11.jpg (198.41 КБ)

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

#6

06.08.2018 08:15:22

Цитата
Maksimelyan написал:
НАзвание папки имеет значение?

Разумеется, НЕТ!  :D
А вот имя файлов html — ДА!
Я попробовала ввести — 45_12345678912345678999999999999.html — получила Вашу ошибку!
Рекомендую внимательно прочесть текст про Вашу ошибку — мое название > 31 символа.
Проверяйте свои названия.  :D  

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

#7

06.08.2018 08:33:04

Цитата
Maksimelyan написал:
Небольшое уточнение, а можно сделать так чтоб информация копировалась как значения?

Разумеется, можно!
Но информация в этом варианте выглядит «очень криво»!  :D
Замените:

Код
      Cells.Select
      ActiveSheet.Paste

на:

Код
    Cells.Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Изменено: Мотя06.08.2018 08:34:18

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

По моему в файле Мотя, в папке должны содержаться только файлы «HTML», потому, что массив обрабатывает все файлы в папке независимо от расширения. Хотя навряд ли в этом ошибка. Уважаемая Мотя, позвольте полюбопытствовать, почему Вы в макросах упорно продолжаете использовать «Select» и «Activate»,хотя не раз на форуме упоминалось о вреде использования данных методов?

Изменено: Nordheim06.08.2018 09:09:22

«Все гениальное просто, а все простое гениально!!!»

 

Dost1369

Пользователь

Сообщений: 76
Регистрация: 12.10.2015

#9

06.08.2018 09:27:45

Цитата
Nordheim написал:
«Select» и «Activate»,хотя не раз на форуме упоминалось о вреде использования данных методов?

А можно ссылочку на обсуждения? Буду повышать свой уровень знаний. :)

 

Дмитрий(The_Prist) Щербаков

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#10

06.08.2018 09:28:37

Цитата
Dost1369 написал:
А можно ссылочку

Select и Activate — зачем нужны и нужны ли?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Dost1369

Пользователь

Сообщений: 76
Регистрация: 12.10.2015

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

#12

06.08.2018 10:07:39

Цитата
Nordheim написал:
позвольте полюбопытствовать, почему Вы в макросах упорно продолжаете использовать «Select» и «Activate»,хотя не раз на форуме упоминалось о вреде использования данных методов?

Уважаемый

Nordheim

!
Специально для Вас:
1. Я — НЕ ПРОФЕССИОНАЛ!
2. К программированию не имею никакого отношения!
3. Макросы пишу НАИТРИВИАЛЬНЕЙШИЕ: «Select» и «Activate» мне абсолютно не мешают!  :D

С уважением, Мотя.

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#13

06.08.2018 20:53:42

Цитата
Мотя написал:
«Select» и «Activate» мне абсолютно не мешают!

Но Вы же показываете плохой пример другим )

 

Мотя, Разобрался, действительно файлы переименовал и файл с макросом убрал из папки где лежат html. Все сработало.

извините что напрягаю, но хорошая мысля приходит опосля, и у меня такой вопрос.

1. Как прописать вариант чтобы не нужно было выбирать папку а положил в папку с файлами и обработка шла в этой папке?

2. Как прописать вариант чтобы макрос при выборе основной папке обрабатывал файлы которые лежат в отдельных папках основной папки.

Изменено: Maksimelyan06.08.2018 21:57:55

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#15

06.08.2018 21:39:46

Цитата
Мотя написал:
3. Макросы пишу НАИТРИВИАЛЬНЕЙШИЕ: «Select» и «Activate» мне абсолютно не мешают!  

На счет «Тривиальности» можно поспорить, у вас настолько оригинальные макросы, что  ходу сложно понять что откуда берется   :D .
И только путем прогона через F8, и то не с первого раза  8)
К слову, макрос из сообщения №3 мне понятен, потому как не один раз по данному алгоритму сам писал такой код.

Изменено: Nordheim06.08.2018 21:43:31

«Все гениальное просто, а все простое гениально!!!»

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

#16

06.08.2018 21:53:54

Цитата
Maksimelyan написал:
Макрос обрабатывается но результата нет.((

Результат: вновь созданные листы (кроме листа «111») в файле Maksimelyan.xlsb с именами — Dir(FILE).  ;)  

 

Maksimelyan

Пользователь

Сообщений: 25
Регистрация: 14.06.2018

#17

06.08.2018 22:01:49

Цитата
Мотя написал:
кроме листа «111»

Да,всё работает спасибо. Мотя а уточните какую роль играет вкладка 111 -она всегда должна быть?  

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#18

06.08.2018 22:05:58

Цитата
Maksimelyan написал:
какую роль играет вкладка 111 -она всегда должна быть?

В книге должен быть хотя-бы 1 лист. Все остальное, связанное с 111 — от

лукавого

Моти

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

#19

06.08.2018 22:06:09

Цитата
Maksimelyan написал:
какую роль играет вкладка 111

Один лист в файле всегда должен присутствовать.
Если будете его переименовывать, то в макросе его тоже надо изменить:

Код
lst = "111"
 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

Макрос я писала почти «от Балды», поэтому умнее «изменения» названия листа — не придумала!  :D  

 

RAN, уточните пожалуйста как в Вашем варианте прописать чтобы информация копировалась как значение?

Изменено: Maksimelyan06.08.2018 22:20:11

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

#22

06.08.2018 22:17:34

Цитата
Maksimelyan написал:
файл с макросом убрал из папки где лежат html

Макросный файл, по умолчанию, не должен лежать в папке html-файлов.
Правда, я забыла сразу об этом сказать… :)  

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#23

06.08.2018 22:20:35

Цитата
Maksimelyan написал:
прописать чтобы информация копировалась как значение

Лично мне не удалось найти ни одной формулы.

Если я суслика не вижу, а он есть, его нужно показать.  :)

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

#24

06.08.2018 22:21:32

Цитата
Maksimelyan написал:
Как прописать вариант чтобы не нужно было выбирать папку а положил в папку с файлами и обработка шла в этой папке?

Для этого надо в макросе жестко задать имя этой папки: но это же неудобно!
А вдруг — чьи-то шаловливые ручки переименуют папку!  :D  

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

#25

06.08.2018 22:26:55

Цитата
Maksimelyan написал:
Как прописать вариант чтобы макрос при выборе основной папке обрабатывал файлы которые лежат в отдельных папках основной папки.

Над этим надо думать, а это иногда бывает — ОЧЕНЬ ЛЕНИВО…  :D
Для меня, будет сложновато: Я — не ПРОФЕССИОНАЛ!

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#26

06.08.2018 22:26:56

Цитата
Мотя написал:
Для этого надо в макросе жестко задать имя этой папки: но это же неудобно!

Путь к папке в которой находится книга с макросом.

Код
ThisWorkbook.Path

«Все гениальное просто, а все простое гениально!!!»

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#27

06.08.2018 22:28:48

Цитата
Maksimelyan написал:
2. Как прописать вариант чтобы макрос при выборе основной папке обрабатывал файлы которые лежат в отдельных папках основной папки.

Тут нужно воспользоваться FileSystemObject. но это уже совсем другая история. Хотя можно и через Dir

Изменено: Nordheim06.08.2018 22:29:43

«Все гениальное просто, а все простое гениально!!!»

 

Maksimelyan

Пользователь

Сообщений: 25
Регистрация: 14.06.2018

#28

06.08.2018 22:34:18

Цитата
RAN написал:
Лично мне не удалось найти ни одной формулы.

Формул действительно нет, но я потом планирую как раз использовать формулы ВПР для обработки данных и так как там есть ячейки объединенные и мне нужны от туда данные, то хотел чтобы информация была вставлена как значение

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#29

06.08.2018 22:36:31

Цитата
Nordheim написал:
Хотя можно и через Dir

А это будет интересно.

 

Maksimelyan

Пользователь

Сообщений: 25
Регистрация: 14.06.2018

#30

06.08.2018 22:37:00

Цитата
Мотя написал:
Для меня, будет сложновато: Я — не ПРОФЕССИОНАЛ!

Ваш Вариант работает,мне это было не под силу. Так что для меня Вы профессионал. Спасибо что уделили время, вы мне очень помогли.

Skip to content

Как открыть все рабочие книги в папке

На чтение 2 мин. Просмотров 3.5k.

Что делает макрос: Представьте, вы написали классный макрос, который автоматизирует работу одного Excel- файла. Теперь проблема заключается в том, что вам нужно перейти в папку, открыть каждую
книгу, запустить макрос, сохранить изменения, закрыть книгу, а затем открыть следующую.
Открытие каждой рабочей книги в папке, как правило, ручной процесс, который отнимает много времени.
Этот макрос решает проблему, как открыть все рабочие книги папки.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как работает этот код
  4. Как использовать

Как макрос работает

В этом макросе, мы используем функцию Dir. Функция Dir возвращает строку, которая представляет собой имя файла. С её помощью в указанной папке мы возьмём имя каждого файла (с расширением “.xlsx”), затем будем открывать каждый файл, запускать макрос и, наконец, закрывать файл после сохранения.

Код макроса

Sub OtkritVseKnigi()
'Шаг 1:Объявляем переменные
Dim MyFiles As String
'Шаг 2: Укажите нужную папку
MyFiles = Dir("C:Temp*.xlsx")
Do While MyFiles <> “”
'Шаг 3: Открываем файлы один за другим
Workbooks.Open "C:Temp" & MyFiles
'Код макроса с действиями
MsgBox ActiveWorkbook.Name
ActiveWorkbook.Close SaveChanges:=True
'Шаг 4: Следующий файл в папке
MyFiles = Dir
Loop
End Sub

Как работает этот код

  1. Объявляем переменную MyFiles (тип строчный), которая будет фиксировать имя каждого файла.
  2. В шаге 2, макрос использует функцию DIR, чтобы указать Тип файла и адрес папки. Обратите внимание, что код ищет файлы в формате xlsx. Это означает, что только .xlsx файлы будут передаваться. Если вы ищете .xls файлы, вам необходимо изменить расширение.
  3. Открываем файл, делаем некоторые действия (вы должны поместить в код макроса требуемые действия), а затем мы сохраняем и закрываем файл. В этом простом примере, мы вызываем окно с сообщением, чтобы показать имя каждого файла.
  4. Ищем снова по кругу, чтобы найти больше файлов. Если нет файлов, переменная MyFiles пустая.
    Если это так, то цикл и макрос завершается.

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код во вновь созданном модуле.

Понравилась статья? Поделить с друзьями:
  • Excel метод жордана гаусса
  • Excel миф объединенная ячейка
  • Excel миф несколько диапазонов
  • Excel метод гаусса скачать
  • Excel миф найти ячейки