Доброго времени суток, и сегодня мы разберём 2-ой пример на тему «Работа со строками VBA». Отмечу, что в этом примере используются много интересных функций для строк, которые ранее не разбирались. И раз мы уже добрались до данной статьи, не буду вдаваться в детальные подробности. Сегодня поговорим только о новых командах. Поехали!
Задача:
Для введённых пользователем путей (как ссылочных, так и «проводниковых») написать программу, которая выполняет 3 действия:
1) Превращает обычный «проводниковый» путь в ссылочный.
2) Удаляет имя каталога, предшествующее конечному объекту, например, C:/Windows/test.txt -->
C:/test.txt
3) Приписать к каждому файлу в конце имени CodeTown
Вывод должен быть представлен в виде таблицы со столбцами: «Исходные данные», «1 задание», «2 задание» и «3 задание».
Звучит несложно, правда? =)
Приступим:
Private Sub prog2() Dim s1 As String Dim s2 As String Dim s3 As String Dim kol As Integer Dim i As Integer Dim x As Byte Dim Arr Dim Arr2 Dim otrez As String Dim size As Integer '1 задание' size = WorksheetFunction.CountA(Worksheets(1).Columns(1)) s2 = "http://" For i = 2 To size s1 = Cells(i, 1) x = InStr(s1, ":\") If x = 0 Then If Left(s1, 7) = s2 Then 'если интернет ссылка' s3 = s1 Else s3 = s2 + s1 End If Else otrez = Left(s1, x + 1) s3 = Replace(s1, otrez, s2) End If s3 = Replace(s3, "\", "/") Cells(i, 2) = s3
Начнём с того, что если не задавать у переменной тип, то VBA по умолчанию присвоит ей тип Variant, что означает любой. Грубо говоря, вы можете записать всё, что хотите в эту переменную, и это будет воспринято соответственно: если только целые, то int, дробные — Double т.д., но это делать не всегда разумно.
Основной алгоритм решения первого задания прост: проверяем, является ли путь «проводниковым», если Да, то заменяем переднюю часть на http://, если Нет, то проверяем, является ли путь ссылкой: Да — всё так и оставляем, Нет — добавляем вначале http://. В конце заменяем все «\» на «/».
Left() — копирует определённое количество слева, которое мы можем задать, символов строки. Есть аналог, команда Right() — как вы, наверно, догадались, копирует справа.
'2 Задание' If Left(s1, 7) = s2 Then 'интернет ссылка' Arr = Split(s1, "/") Arr2 = Arr kol = UBound(Arr) If kol > 2 Then ReDim Preserve Arr(kol - 2) Cells(i, 3) = Join(Arr, "/") + "/" + Arr2(kol) Else Cells(i, 3) = Join(Arr, "/") End If Else Else Arr = Split(s1, "\") 'локальная ссылка' Arr2 = Arr kol = UBound(Arr) If kol > 1 Then ReDim Preserve Arr(kol - 2) Cells(i, 3) = Join(Arr, "\") + "\" + Arr2(kol) Else Cells(i, 3) = Join(Arr, "\") End If End If
«Глаза боятся, мозг работает» =) Не волнуйтесь, сейчас всё разберём:
Split() — разбивает строку на массив строк, где разделителем является пробел по умолчанию, или с заданным символом.
UBOund() — определяет размер массива.
ReDim Preseve в отличии от ReDim переназначает массив с сохранением массива.
Join — объединяет массив в одно целое, в данном случае, массив строк в одну строку.
Теперь алгоритм: определяем является ли путь ссылкой, если Да:
разбиваем на массив строк , считаем сколько получилось частей, если больше 2-ух, то переназначая массив, удаляем у него две последние части и добавляем одну часть (самый конец пути). Если меньше 2-ух, то собираем массив обратно, как было, так как слишком мало частей.
Если путь локальная ссылка делаем абсолютно аналогичные действия, но в этот раз частей должно быть больше 1.
'3 задание' x = InStrRev(s1, ".") otrez = Left(s1, x - 1) s3 = Replace(s1, otrez, otrez + "_CodeTown") Cells(i, 4) = s3 Next i End Sub
Ну после предыдущего куска, тут вы уже ничего не должны боятся.
InStrRev() — аналог InStr(), только поиск идёт с конца строки, и возвращается позиция конечного элемента.
Алгоритм: находим конец имени файла, к которому нас ведёт путь. Затем копируем всё до точки, то есть, весь путь до конца имени файла в переменную, и заменяем её на ту же переменную, но с добавкой «CodeTown».
Заканчиваем цикл.
Наш вывод:
Вот, собственно, и всё. Задавайте вопросы в комментариях. Надеюсь вы прониклись магией VBA, если же нет, читайте продолжение. =)
Скачать исходники
Будьте первым, кто оставит комментарий