Продолжаем говорить о VBA, и сегодня рассмотрим пример работы со строками.
Пользователь вводит путь к файлу в ячейку, и мы должны определить количество папок, через которые нам необходимо пройти до файла, другими словами, определить уровень вложенности. А также заменить все цифры на соответствующие буквы английского алфавита по порядку и вывести название папок до и после изменения.
Наш алгоритм определения вложенности будет заключаться в поиске количества символов «/». Надо учесть, что помимо обычных «проводниковых» путей на компьютере, может быть введёт ссылочный путь, где имеется //. Например, C:/Windiws/… и http://yandex.ru.
Приступим к коду:
Private Sub GetFolder() Dim way As String way = Cells(1, 1) + " "
Для начала зададим сам путь way из ячейки и добавим в конце пробел, иначе в процессе обрезания строк мы можем потерять самый последний символ.
Dim way_ex As String way_ex = way Dim k As Integer Dim x As Integer Dim le As Integer Dim sl As String Dim poisk As String poisk = "/" k = 0 le = Len(way)
way_ex — копия пути, так как мы будем работать с ним и соответственно изменять.
k — искомое количество /.
x — позиция искомого элемента.
le — количество символов в строке.
sl — символьная переменная для промежуточных расчётов.
poisk — символ который будем искать.
Do x = InStr(way, poisk) sl = Mid(way, x + 1, le - x - 1) way = sl k = k + 1 Loop While x <> 0 way = way_ex If InStr(way, "://") <> 0 Then Cells(3, 1) = k - 3 Else Cells(3, 1) = k - 2 End If
В этом отрывке мы находим k и в зависимости какой у нас путь, ссылочный или «проводниковый», с помощью If находим необходимое значение вложенности (сколько каталогов от корня до файла).
Instr() — служит для поиска номера символа, с которого начинается в заданной строке образец поиска. Поиск идет от указанной позиции слева направо. Нумерация символов всегда начинается с единицы. И если символ не найден, возвращается число 0. Синтаксис InStr([Начальная позиция],String1,String2).
Mid() — используется для считывания символов в строке, с заданным параметром «ОТ» и «ДО». Более подробно почитайте тут.
То, что происходит в If, думаю и так ясно, но на всякий случай поясню: мы проверяем, есть ли у нас в пути://, если есть, то значит мы работаем с ссылочным путём.
Dim i As Integer Dim kk As Integer Dim zam As String Dim way_z As String kk = 1 x = 1
Далее объявляем новые переменные, которые нам буду необходимы в процессе.
Do While x <> 0 x = InStr(way, poisk) sl = Mid(way, 1, x) For i = 0 To 9 If InStr(sl, CStr(i)) > 1 Then Cells(1 + kk, 2) = sl If i = 0 Then zam = "A" If i = 1 Then zam = "B" If i = 2 Then zam = "C" If i = 3 Then zam = "D" If i = 4 Then zam = "E" If i = 5 Then zam = "F" If i = 6 Then zam = "G" If i = 7 Then zam = "H" If i = 8 Then zam = "I" If i = 9 Then zam = "J" sl = Replace(sl, CStr(i), zam) Cells(1 + kk, 3) = sl kk = kk + 1 End If Next i way_z = way_z + sl way = Mid(way, x + 1, le - x - 1) Loop way_z = way_z + way Cells(2, 1) = way_z End Sub
В этом куске мы запускаем цикл, который заменяет нам все цифры на буквы английского алфавита. Основной алгоритм — разбиение пути.
Do While x <> 0 — означает что мы будет выполнять цикл пока x (позиция искомого элемента), не будет равен 0, что означает что этого элемента в строке больше нет.
Начинаем поиск /, далее копируем слово до / и прогоняем его по циклу от 0 до 9, находя в нём цифры, если находим, записываем в отдельную ячейку. Далее заменяем цифру на букву, и снова записываем в ячейку пониже. С помощью счётчика kk контролируем количество изменяемых уровней в пути. Добавляем проработанные слова в way_z, составляя новый путь.
С помощью этой строчки way = Mid(way, x + 1, le — x — 1) мы циклично отрезаем от пути проработанные слова. Добавляем к way_z остатки от начального пути и записываем в ячейку.
Вот, собственно, и всё. Задавайте вопросы в комментариях. Надеюсь Вы прониклись магией VBA, если же нет, читайте продолжение. =)
Скачать исходники
Будьте первым, кто оставит комментарий