Excel vba сохранить диапазон в файл
Метод ExportAsFixedFormat сохраняет рабочую книгу Excel или выбранную группу листов этой книги в один PDF-файл. Чтобы экспортировать каждый лист в отдельный файл, необходимо применить метод ExportAsFixedFormat к каждому сохраняемому листу.
Синтаксис
Expression . ExportAsFixedFormat ( Type , FileName , Quality , IncludeDocProperties , IgnorePrintAreas , From , To , OpenAfterPublish , FixedFormatExtClassPtr )
Expression – это выражение, представляющее объект Workbook, Worksheet или Range.
Параметры
Единственный обязательный параметр – Type, остальные можно не указывать – в этом случае будут применены значения по умолчанию.
Параметр | Описание |
---|---|
Type | Задает формат файла для экспорта книги или листа: xlTypePDF(0) – сохранение в файл PDF; xlTypeXPS(1) – сохранение в файл XPS*. |
FileName | Задает имя файла. При указании полного пути, файл будет сохранен в указанную папку, при указании только имени – в папку по умолчанию (в Excel 2016 – «Документы»). Если имя не задано (по умолчанию), файл будет сохранен с именем экспортируемой книги. |
Quality | Задает качество сохраняемых электронных таблиц: xlQualityMinimum(1) – минимальное качество; xlQualityStandard(0) – стандартное качество (по умолчанию). |
IncludeDocProperties | Включение свойств документа Excel в PDF: True(1) – включить; False(0) – не включать; мне не удалось обнаружить разницу и значение по умолчанию. |
IgnorePrintAreas | Указывает VBA, следует ли игнорировать области печати, заданные на листах файла Excel: True(1) – игнорировать области печати; False(0) – не игнорировать области печати (по умолчанию). |
From** | Задает номер листа книги Excel, с которого начинается экспорт. По умолчанию сохранение в PDF начинается с первого листа книги. |
To** | Задает номер листа книги Excel, на котором заканчивается экспорт. По умолчанию сохранение в PDF заканчивается на последнем листе книги. |
OpenAfterPublish | Указывает VBA на необходимость открыть созданный файл PDF средством просмотра: True(1) – открыть файл PDF для просмотра; False(0) – не открывать файл PDF для просмотра (по умолчанию). |
FixedFormatExtClassPtr | Указатель на класс FixedFormatExt (игнорируем этот параметр). |
* XPS – это редко использующийся фиксированный формат файлов, разработанный Microsoft, который похож на PDF, но основан на языке XML.
** Применимо только к книге (Workbook.ExportAsFixedFormat), при экспорте листа (Worksheet.ExportAsFixedFormat) указание параметров From и/или To приведет к ошибке.
Доброго времени суток. Будьте добры, помогите пожалуйста написать макрос для копирования определенной области из листа одной книги, в лист другой книги. Причем, чтобы каждый раз сохранение вставлялось в конец предыдущего сохранения. То есть последовательно вниз друг за другом. Навыков в программировании нет. Пробовал действия записывать макросом, но застопорилось на том, как копировать последовательно друг за другом. Заранее всем спасибо.
[moder]Что конкретно копировать? и куда?
Доброго времени суток. Будьте добры, помогите пожалуйста написать макрос для копирования определенной области из листа одной книги, в лист другой книги. Причем, чтобы каждый раз сохранение вставлялось в конец предыдущего сохранения. То есть последовательно вниз друг за другом. Навыков в программировании нет. Пробовал действия записывать макросом, но застопорилось на том, как копировать последовательно друг за другом. Заранее всем спасибо.
[moder]Что конкретно копировать? и куда? svitaly77
В приложенном файле на листе "Карточка" таблицу, нужно будет скопировать и сохранить в другую книгу (назовем ее "Квартал"), затем "Карточка" обновляется новыми данными, ее будет надо опять скопировать и сохранить в "Квартал", но уже ниже предыдущей. То есть последовательно вниз.
В приложенном файле на листе "Карточка" таблицу, нужно будет скопировать и сохранить в другую книгу (назовем ее "Квартал"), затем "Карточка" обновляется новыми данными, ее будет надо опять скопировать и сохранить в "Квартал", но уже ниже предыдущей. То есть последовательно вниз. svitaly77
Макрос должен запускаться, когда активный лист - это лист, с которого нужно копировать.
Для работы макроса файл, куда надо скопировать, должен находиться в той же папке, что и файл, из которого копируются данные.
В макросе посмотрите комментарии.
На листе, куда копируются данные, должны быть какие-нибудь данные, например, шапка таблицы, иначе будет ошибка.
Dim shSrc As Worksheet, shRes As Worksheet
Dim lrSrc As Long, lrRes As Long
Set shSrc = ActiveSheet
'Здесь нужно указать имя файла (куда копируются данные) и лист, на который копируются данные
Set shRes = Workbooks.Open(ActiveWorkbook.Path & "\" & "Квартал.xlsx").Worksheets(1)
lrSrc = shSrc.Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
lrRes = shRes.Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row + 1
shSrc.Range("A1:V" & lrSrc).Copy shRes.Cells(lrRes, 1)
Макрос должен запускаться, когда активный лист - это лист, с которого нужно копировать.
Для работы макроса файл, куда надо скопировать, должен находиться в той же папке, что и файл, из которого копируются данные.
В макросе посмотрите комментарии.
На листе, куда копируются данные, должны быть какие-нибудь данные, например, шапка таблицы, иначе будет ошибка.
Dim shSrc As Worksheet, shRes As Worksheet
Dim lrSrc As Long, lrRes As Long
Set shSrc = ActiveSheet
'Здесь нужно указать имя файла (куда копируются данные) и лист, на который копируются данные
Set shRes = Workbooks.Open(ActiveWorkbook.Path & "\" & "Квартал.xlsx").Worksheets(1)
lrSrc = shSrc.Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
lrRes = shRes.Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row + 1
shSrc.Range("A1:V" & lrSrc).Copy shRes.Cells(lrRes, 1)
Dim shSrc As Worksheet, shRes As Worksheet
Dim lrSrc As Long, lrRes As Long
Set shSrc = ActiveSheet
'Здесь нужно указать имя файла (куда копируются данные) и лист, на который копируются данные
Set shRes = Workbooks.Open(ActiveWorkbook.Path & "\" & "Квартал.xlsx").Worksheets(1)
lrSrc = shSrc.Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
lrRes = shRes.Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row + 1
Доброй всем пятницы.
Подскажите код макроса, который бы сохранял диапазон AJ3:BU36 в новый файл с запросом папки сохранения.
На форуме есть примеры, но не хватает опыта настроить под работу своего файла.
Доброй всем пятницы.
Подскажите код макроса, который бы сохранял диапазон AJ3:BU36 в новый файл с запросом папки сохранения.
На форуме есть примеры, но не хватает опыта настроить под работу своего файла. VIDEO56
Всем удачного дня!
Sub Макрос1()
Dim wb As Workbook, s$
Range("AJ3:BU36").Copy
Set wb = Workbooks.Add
Cells(1, 1).PasteSpecial Paste:=xlPasteValues: Cells(1, 1).PasteSpecial Paste:=xlPasteFormats
s = GetFolderPath
s = s & InputBox("Имя файла")
s = s & ".xlsx"
wb.SaveAs Filename:=s, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
wb.Close
End Sub
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
Optional ByVal InitialPath As String = "c:\") As String
' функция выводит диалоговое окно выбора папки с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
Dim PS As String: PS = Application.PathSeparator
With Application.FileDialog(msoFileDialogFolderPicker)
If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
GetFolderPath = .SelectedItems(1)
If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
End With
End Function
Sub Макрос1()
Dim wb As Workbook, s$
Range("AJ3:BU36").Copy
Set wb = Workbooks.Add
Cells(1, 1).PasteSpecial Paste:=xlPasteValues: Cells(1, 1).PasteSpecial Paste:=xlPasteFormats
s = GetFolderPath
s = s & InputBox("Имя файла")
s = s & ".xlsx"
wb.SaveAs Filename:=s, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
wb.Close
End Sub
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
Optional ByVal InitialPath As String = "c:\") As String
' функция выводит диалоговое окно выбора папки с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
Dim PS As String: PS = Application.PathSeparator
With Application.FileDialog(msoFileDialogFolderPicker)
If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
GetFolderPath = .SelectedItems(1)
If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
End With
End Function
Sub Макрос1()
Dim wb As Workbook, s$
Range("AJ3:BU36").Copy
Set wb = Workbooks.Add
Cells(1, 1).PasteSpecial Paste:=xlPasteValues: Cells(1, 1).PasteSpecial Paste:=xlPasteFormats
s = GetFolderPath
s = s & InputBox("Имя файла")
s = s & ".xlsx"
wb.SaveAs Filename:=s, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
wb.Close
End Sub
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
Optional ByVal InitialPath As String = "c:\") As String
' функция выводит диалоговое окно выбора папки с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
Dim PS As String: PS = Application.PathSeparator
With Application.FileDialog(msoFileDialogFolderPicker)
If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
GetFolderPath = .SelectedItems(1)
If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
End With
End Function
Про сборку листов из нескольких книг в одну текущую я уже писал здесь. Теперь разберем решение обратной задачи: есть одна книга Excel, которую нужно "разобрать", т.е. сохранить каждый лист как отдельный файл для дальнейшего использования.
Примеров подобного из реальной жизни можно привести массу. Например, файл-отчет с листами-филиалами нужно разделить на отдельные книги по листам, чтобы передать затем данные в каждый филиал и т.д.
Если делать эту процедуру вручную, то придется для каждого листа выполнить немаленькую цепочку действий (выбрать лист, правой кнопкой по ярлычку листа, выбрать Копировать, указать отдельный предварительно созданный пустой файл и т.д.) Гораздо проще использовать короткий макрос, автоматизирующий эти действия.
Способ 1. Простое разделение
Нажмите сочетание Alt+F11 или выберите в меню Сервис - Макрос - Редактор Visual Basic (Tools - Macro - Visual Basic Editor) , вставьте новый модуль через меню Insert - Module и скопируйте туда текст этого макроса:
Если теперь выйти из редактора Visual Basic и вернуться в Excel, а затем запустить наш макрос (Alt+F8), то все листы из текущей книги будут разбиты по отдельным новым созданным книгам.
Способ 2. Разделение с сохранением
При необходимости, можно созданные книги сразу же сохранять под именами листов. Для этого макрос придется немного изменить, добавив команду сохранения в цикл:
Этот макрос сохраняет новые книги-листы в ту же папку, где лежал исходный файл. При необходимости сохранения в другое место, замените wb.Path на свой путь в кавычках, например "D:\Отчеты\2012" и т.п.
Если нужно сохранять файлы не в стандартном формате книги Excel (xlsx), а в других (xls, xlsm, xlsb, txt и т.д.), то кроме очевидного изменения расширения на нужное, потребуется добавить еще и уточнение формата файла - параметр FileFormat:
Для основных типов файлов значения параметра FileFormat следующие:
- XLSX = 51
- XLSM = 52
- XLSB = 50
- XLS = 56
- TXT = 42
Способ 3. Сохранение в новые книги только выделенных листов
Если вы хотите раскидать по файлам не все листы в вашей книге, а только некоторые, то макрос придется немного изменить. Выделите нужные вам листы в книге, удерживая на клавиатуре клавишу Ctrl или Shift и запустите приведенный ниже макрос:
Создавать новое окно и копировать через него, а не напрямую, приходится потому, что Excel не умеет копировать группу листов, если среди них есть листы с умными таблицами. Копирование через новое окно позволяет такую проблему обойти.
Способ 4. Сохранение только выделенных листов в новый файл
Во всех описанных выше способах каждый лист сохранялся в свой отдельный файл. Если же вы хотите сохранить в отдельный новый файл сразу группу выделенных предварительно листов, то нам потребуется слегка видоизменить наш макрос:
Способ 5. Сохранение листов как отдельных PDF-файлов
- для этого используется уже другой метод (ExportAsFixedFormat а не Copy)
- листы выводятся в PDF с параметрами печати, настроенными на вкладке Разметка страницы (Page Layout)
- книга должна быть сохранена на момент экспорта
Нужный нам код будет выглядеть следующим образом:
Способ 6. Готовый макрос из надстройки PLEX
Если лень или нет времени внедрять все вышеописанное, то можно воспользоваться готовым макросом из моей надстройки PLEX:
Сохранение одномерного массива в текстовый файл с добавлением разделителя между его элементами.
Объявляем переменную универсального типа, создаем из нее массив, заполнив ее данными с помощью функции Array:
Теперь создаем текстовый файл с помощью метода CreateTextFile. Создаем, а не открываем, для того, чтобы, если такой файл с данными уже существует, от был перезаписан новым пустым файлом.
Если переменную, предназначенную для создания нового объекта TextStream объявить явно: fl As TextStream , то станут доступны подсказки для автозаполнения свойств и методов этого объекта при написании кода.
Сохраняем информацию из массива в текстовый файл с помощью цикла For… Next:
В качестве разделителя элементов массива используется символ «;». Если точка с запятой встречается в содержимом элементов массива, следует использовать другой разделитель.
Закрываем объект TextStream и открываем созданный текстовый файл для просмотра:
Полный код процедуры VBA Excel для сохранения одномерного массива в текстовый файл:
Сохранение двумерного массива
Сохранение двумерного массива в текстовый файл с использованием в качестве разделителей точки с запятой (для элементов в одной строке) и переноса строки.
Раз у нас VBA Excel, то и заполнять двумерный массив будем данными с рабочего листа:
В результате будет создан массив с размерностью (1 to 8, 1 to 4) . Первое измерение массива соответствует строкам диапазона, в второе – столбцам.
Создаем текстовый файл (или перезаписываем существующий) и открываем связанный с ним объект TextStream для записи данных из массива:
Записываем данные из двумерного массива в текстовый файл:
Закрываем объект TextStream и открываем созданный текстовый файл для просмотра:
Полный код процедуры VBA Excel для сохранения двумерного массива в текстовый файл:
Заполнение массива из текстового файла
Заполнение одномерного массива
Обратное заполнение с помощью кода VBA Excel одномерного массива данными из созданного текстового файла "C:\test\testfile1.txt" :
Заполнение двумерного массива
Обратное заполнение с помощью кода VBA Excel двумерного массива из созданного текстового файла "C:\test\testfile2.txt" .
Копируем информацию из текстового файла в переменную myString1:
Что мы теперь имеем? Все данные из файла "C:\test\testfile2.txt" скопированы в переменную myString1 с исходной структурой: со знаком переноса строки в качестве разделителя строк и точкой с запятой в качестве разделителя столбцов. Этой информацией мы и воспользуемся для заполнения массива myArray() .
Читайте также: