FileSystemObject
MsgBox «Использование объекта FileSystemObject...» & vbCrLf
& _
vbCrLf & dhSearchFileSystemObject(strFullPath), vbInformation, _
strFullPath
End Sub
Function dhSearchVBA(varFullPath As Variant) As Boolean
' Использование команды VBA
dhSearchVBA = Dir(varFullPath) <> ""
End Function
Function dhSearchFileSystemObject(varFullPath As Variant) As
Boolean
Dim objFSObject As Object
' Использование объекта FileSystemObject
Set objFSObject = CreateObject(«Scripting.FileSystemObject»)
dhSearchFileSystemObject = objFSObject.FileExists(varFullPath)
End Function
В результате запуска макроса открывается окно, в котором указывается папка для поиска, а затем (после нажатия кнопки ОК) – имя искомого файла. В данном примере для поиска файла используются два разных метода. После ввода имени папки и файла они будут применены поочередно, и в каждом случае будет показан отдельный результат: если файл обнаружен по указанному пути, то отобразится значение True, в противном случае – False.
В результате написания приведенного выше кода, помимо макроса FileSearch, будут созданы три пользовательские функции (их можно найти в категории Определенные пользователем). С помощью этих функций можно отдельно использовать каждый из методов, которые автоматически применяются при выполнении макроса. В данном случае в качестве аргументов функций указываются ячейки, содержащие путь к искомому файлу. Если файл обнаружен по указанному пути, то в активной ячейке отобразится значение ИСТИНА, в противном случае – ЛОЖЬ.
Автоматизация удаления файлов
Используя средства VBA, можно удалять как отдельные файлы, так и группы файлов в соответствии с заданными параметрами.
Чтобы удалить отдельный файл, можно воспользоваться следующим макросом (листинг 3.49).
Sub DeleteFile()
Kill «C:\Документы\primer.xls»
End Sub
В результате выполнения данного макроса будет удален файл primer.xls, расположенный по адресу С: \ Документы.
Для удаления группы файлов с определенным расширением можно использовать следующий макрос (листинг 3.50).
Sub DeleteFiles()
' Удаление всех файлов с расширением XLS из заданной папки
Kill «C:\Документы\» & «*.xls»
End Sub
После выполнения этого макроса из папки Документы на диске С: будут удалены все файлы, имеющие расширение XLS.
При удалении файлов с помощью приведенных макросов следует учитывать, что они не помещаются в Корзину, а окончательно удаляются с жесткого диска.
Перечень имен листов в виде гиперссылок
При необходимости можно вывести в виде списка перечень имен листов текущей рабочей книги, причем каждое имя в списке будет представлять собой гиперссылку, с помощью которой можно быстро перейти к соответствующему листу. Для этого можно воспользоваться таким макросом (листинг 3.51).
Sub SheetNamesAsHyperLinks()
Dim sheet As Worksheet
Dim cell As Range
With ActiveWorkbook
' Просмотр всех листов книги и создание гиперссылок на них _
на первом листе
For Each sheet In ActiveWorkbook.Worksheets
Set cell = Worksheets(1).Cells(sheet.Index, 1)
.Worksheets(1).Hyperlinks.Add Anchor:=cell, Address:="", _
SubAddress:="’" & sheet.Name & "“" & «!A1»
cell.Formula = sheet.Name
Next
End With
End Sub
Результат выполнения макроса показан на рис. 3.15 – имена рабочих листов выведены в виде списка, каждый элемент которого представляет собой гиперссылку.
Рис. 3.15. Список имен рабочих листов
Удаление пустых строк на рабочем листе
В процессе работы иногда возникает необходимость избавиться от пустых строк на рабочем листе. В большинстве случаев для решения данной задачи используются штатные средства программы. Однако при большом количестве пустых строк целесообразно воспользоваться макросом, код которого приведен в листинге 3.52.
Sub DeleteEmptyStrings()
Dim intLastRow As Integer ' Номер последней используемой
строки
Dim intRow As Integer ' Номер проверяемой строки
' Получение номера последней используемой строки
intLastRow = Worksheets(ActiveSheet.Index).UsedRange.Row + _
Worksheets(ActiveSheet.Index).UsedRange.Rows.Count – 1
' Счетчик устанавливается на используемую первую строку
intRow = Worksheets(ActiveSheet.Index).UsedRange.Row
' Удаление пустых строк
Do While intRow <= intLastRow
If ActiveSheet.Rows(intRow).Text = "" Then
' Удаление строки
ActiveSheet.Rows(intRow).Delete
' Данные сдвинулись вверх, поэтому номер последней _
строки уменьшился, а текущей – не изменился
intLastRow = intLastRow – 1
Else
' Текущая строка заполнена – переходим к следующей
intRow = intRow + 1
End If
Loop
End Sub
При выполнении данной операции следует учитывать, что будут удалены только пустые строки, представляющие собой «пробелы». Например, если данные хранятся в строках с 1 по 10, но при этом строки 5 и 7 пустые, то после применения макроса строки 5 и 7 будут удалены и заменены следующими за ними строками с данными, а строки 11,12,13,14…. останутся на месте.
К аналогичному результату приведет также использование такого макроса (листинг 3.53). В данном случае удаление пустых строк происходит снизу вверх. Это позволяет упростить алгоритм, так как не нужно учитывать сдвиг данных вверх при удалении строк.
Sub DeleteEmptyStrings1()
Dim intRow As Integer
Dim intLastRow As Integer
' Получение номера последней используемой строки
intLastRow = ActiveSheet.UsedRange.Row + _
ActiveSheet.UsedRange.Rows.Count – 1
' Удаление пустых строк
For intRow = intLastRow To 1 Step -1
If ActiveSheet.Rows(intRow).Text = "" Then
ActiveSheet.Rows(intRow).Delete
End If
Next intRow
End Sub
Для удобства работы можно создать кнопку и привязать к ней какой-либо из приведенных макросов – тогда удаление пустых строк будет производиться при нажатии этой кнопки.
Запись текущих данных в текстовый файл
С помощью несложного трюка можно быстро записать все данные, хранящиеся на текущем рабочем листе, в текстовый файл. В листинге 3.54 приведен код макроса, который позволяет решить эту задачу.
Sub SaveAsText()
Dim cell As Range
' Открытие файла для сохранения (имя файла соответствует
имени _
рабочей книги, но отличается расширением – TXT)
Open ThisWorkbook.Path & "\" & ThisWorkbook.Name & «.txt» _
For Output As #1
' Запись содержимого заполненных ячеек таблицы в файл
For Each cell In ActiveSheet.UsedRange
If Not IsEmpty(cell) Then
Print #1, cell.Address, cell.Formula
End If
Next
' Не забываем закрывать файл
Close #1
End Sub
К аналогичному результату приведет использование такого макроса (он отличается тем, что учитывает национальные настройки) (листинг 3.55).
Sub SaveAsText1()
Dim cell As Range
' Открытие файла для сохранения (имя файла соответствует
имени _
рабочей книги, но отличается расширением – TXT)
Open ThisWorkbook.Path & "\" & ThisWorkbook.Name & «.txt» _
For Output As #1
' Запись содержимого заполненных ячеек таблицы в файл
For Each cell In ActiveSheet.UsedRange
If Not IsEmpty(cell) Then
Print #1, cell.Address, cell.FormulaLocal
End If
Next
' Не забываем закрывать файл
Close #1
End Sub
В результате выполнения любого из указанных макросов будет создан текстовый файл, помещенный в тот же каталог, в котором находится текущая рабочая книга. Имя файла формируется следующим образом: если текущий файл называется Primer.xls, то имя созданного на его основе текстового файла будет Primer.xls.txt. В этом файле, помимо хранящихся на рабочем листе данных, содержатся координаты ячеек, в которых расположены эти данные.
Экспорт и импорт данных
В данном разделе мы рассмотрим еще один способ экспортирования данных в текстовый файл, а также импорт данных из текстового файла.
Для решения поставленных задач нам потребуются два макроса: один – для экспорта данных, другой – для их импорта. Чтобы создать эти макросы, напишем в стандартном модуле редактора VBA код, который представлен в листинге 3.56.
Sub ExportAsText()
Dim lngRow As Long
Dim intCol As Integer
' Открытие файла для сохранения
Open «C:\primer.txt» For Output As #1
' Запись выделенной части таблицы в файл (построчно)
For lngRow = 1 To Selection.Rows.Count
' Запись содержимого всех столбцов строки lngRow
For intCol = 1 To Selection.Columns.Count
Write #1, Selection.Cells(lngRow, intCol).Value;
Next intCol
' Начнем новую строку в файле
Print #1, ""
Next lngRow
' Не забываем закрыть файл
Close #1
End Sub
Sub ImportText()
Dim strLine As String ' Одна строка файла
Dim strCurChar As String * 1 ' Анализируемый символ строки
файла
Dim strValue As String ' Значение для записи в ячейку