Skip to content

Работа с файлами VBA

Приветствую! Сегодня мы поговорим о файлах, а точнее, как получать информацию из текстовых файлов в VBA. И будем повышать ваше умение программировать, как обычно, на примере.

Задача:

В обычном текстовом файле содержатся строки:

Приветствуем Вас на сайте CodeTown.ru
здесь Вы найдёте много интересных
примеров на разные темы
и на разных языках.
Наслаждайтесь=)

Необходимо вывести их на лист в Excel, чтобы каждое слово находилось в своей ячейки с учётом пробелов.

Поехали!

Sub Prog()
    Dim r As Integer
    Dim c As Integer
    Dim sl As String
    Dim x As Integer
    
    Close #1
    Open "file.txt" For Input As #1
    r = 0
    Do Until EOF(1)
        c = 0
        Line Input #1, Data
        Do While InStr(Data, " ") <> 0
            x = InStr(Data, " ")
            sl = Left(Data, x)
            Data = Right(Data, Len(Data) - x)
            Cells(r + 1, c + 1) = sl
            c = c + 1
        Loop
         Cells(r + 1, c + 1) = Data
        r = r + 1
    Loop
    Close #1
End Sub

Open «file.txt» For Input As #1 — таким образом прописываем путь к файлу, который мы хотим прочитать. Помните, что наши пути могут различаться. Также в конце команды мы присваиваем файлу идентификационный номер. В нашем случае 1.

Do Until EOF(1) — инициализация цикла чтения файла, пока не кончится файл (End Of File). В скобках функции указываем идентификационный номер файла, с которым мы работаем.

Line Input #1, Data — построчное считывание информации из файла. То есть, за каждую итерацию цикла Do Until EOF(1)F(1) мы обрабатываем одну строку.
Функция Line Input является наследуемой функцией от функции Input, которая в свою очередь позволяет считывать данные разного формата из открытых файлов разного типа. Подробный синтаксис вы можете найти здесь.

Как видите, программа небольшая и мы прошли уже основную часть. Мы смогли считать данные в виде строки, теперь, необходимо её обработать. То есть, поделить на слова и записать каждое в ячейку.

Do While InStr(Data, " ") <> 0 — инициализирует цикл разделения строки на слова по пробелам. Собственно, сама функция InStr(Data, " ") занимается поиском символа, указанного на второй позиции (в нашем случае пробел) в строке, указанной на первой позиции (Data). Поиск осуществляется слева направо. Результатом функции является позиция найденного символа. Подробнее читайте тут. Таким образом, цикл не закончится, пока не закончатся пробелы. Однако, следует помнить, что пробел редко стоит в конце строки(обычно из-за ошибки автора). По этому после выхода из цикла в переменной Data останется последнее слово строки. Не забудем его вывести.

Напоследок, обратите внимание на расположение обнуляющих операций переменный c и r. Нам приходится обнулять переменную r перед началом обработки строки, чтобы реализовать перенос между строк.

Если Вам какие-то команды остались не ясны, советую почитать предыдущие статьи, там вы найдёте примеры на работу с ними.

Наш вывод:
7

Вот, собственно, и всё, разобрали некоторые моменты работы с файлами в VBA. Задавайте вопросы в комментариях. Надеюсь вы прониклись магией VBA, если же нет, читайте продолжение. =)

Скачать исходники

Опубликовано вVBA

3 комментария

  1. Tim Tim

    Пример того как не надо учить и программировать, тем более учить программировать.
    1) Плохая подача материала. Не объясняется синтаксис функции Input (подробнее смотрите в справке или Гугле?).
    2) Можно было бы дописать несколько строк в начале с диалогом выбора файла. Стало бы более удобно и наглядно.
    3) Обязательно перераспределять массив перед каждым чтением??? Не проще ли писать всё в одну строку: s = s + simb (simb — считанный из файла символ), а потом обрабатывать эту строку? Это конечно не сильно критично в данном случае, но такой алгоритм считается плохим тоном в программировании.
    4) Использование функции InStr вместо операторов = или ? Громоздко и хуже читается код.
    5) Отслеживание конца файла через генерацию ошибки??? %) EOF — не?
    Почему бы во втором цикле не отследить через ошибку конец массива? 🙂 Да вообще можно через ошибку останавливать программу :)))

  2. Tim Tim

    В предыдущем комментарии отфильтрованы угловые скобки.
    4) Использование функции InStr вместо операторов = или «не равно»? Громоздко и хуже читается код.

    • Nikitas Nikitas

      Здравствуй, Tim.
      Спасибо за детальный отзыв о статье и за помощь в развитии ресурса!
      Мы прислушались к твоим советам и изменили статью.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *