Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2009, 18:17   #1
mephist
Форумчанин
 
Регистрация: 01.05.2009
Сообщений: 200
По умолчанию Разделение строки по критерию

Вынужден обратиться с пустяковым вопросом.
Мне нужно разделить полный путь к файлу.
То есть, имеется строка в ячейке A1 "D:\fol1\1.txt",
я хочу, чтобы в строке А2 оказалось "D:"
в строке А3 оказалось "fol1"
в строке А4 оказалось "1.txt"
Сделал бы сам, но не знаю как поэлементно обращаться к символам строки(в Паскале было такое:
Код:
m : string;
If m[i]='\' then ...
).
А вот как сделать это самое m[i]= ????

А нельзя ли использовать Экселевские примочки??? Я знаю что такая задача решается легко автоматически при загрузке текстового файла, если в качестве разделителя взять "\". Нельзя ли это как-нибудь приспособить к моему случаю???
mephist вне форума Ответить с цитированием
Старый 12.08.2009, 18:20   #2
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

A1 = "D:\fol1\1.txt"
Код:
if [a1] like "*\*" then [А2] = Split([A1])(0):[А3] = Split([A1])(1):[А4] = Split([A1])(2)
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 12.08.2009, 18:42   #3
mephist
Форумчанин
 
Регистрация: 01.05.2009
Сообщений: 200
По умолчанию

супер! как раз то, что нужно. можно один уточняющий вопрос: как мне провести эту процедуру в цикле, если я не знаю сколько раз будет встречаться /
То есть:
Код:
    For j = 1 To .UsedRange.Rows.Count
        If Cells(j, 1) Like "*\*" Then
            For k = 1 To MMM
                Cells(j + k, 1) = Split(Cells(j, 1))(k - 1)
            Next k
    Next j
Я не знаю, какой длины будет путь и сколько раз встретится /,поэтому
Что мне поставить вместо MMM???
mephist вне форума Ответить с цитированием
Старый 12.08.2009, 19:02   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Sub DirSplit()
s = "D:\fol1\1.txt"
c = 1
p1 = 1: p2 = 0
For ch = 1 To Len(s)
If Mid(s, ch, 1) = "\" Then
p2 = ch
Cells(1, c) = Mid(s, p1, p2 - p1)
c = c + 1
p1 = p2 + 1
End If
Next
Cells(1, c) = Mid(s, p1, 1000)
End Sub

Mid аналог паскалевского m[i]
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 12.08.2009, 20:11   #5
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Твой фрагмент,с исправлениями

Код:
Dim v As Variant
Dim s As String
 For j = 1 To .UsedRange.Rows.Count
        If Cells(j, 1) Like "*\*" Then
        s = Cells(j, 1)
        v = Split(s, "\", -1)
        
        
        
            For k = 0 To UBound(v)
                Cells(j + k, 1) = v(k)
            Next k

         end if   
    Next j

UBound (функция) - возвращает значение наибольшего индекса для данной размерности массива
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 12.08.2009 в 20:22.
doober вне форума Ответить с цитированием
Старый 13.08.2009, 00:26   #6
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Всё несколько проще
Код:
Public Sub MySpliter(r As Range)
    If r.Cells.Count > 1 Then Exit Sub
    r.Offset(1, 0).Resize(UBound(Split(r.Value, "\")) + 1, 1) = Application.Transpose(Split(r.Value, "\"))
End Sub
Разумеется, split можно генерализовать, введя временную переменную
А можно и без VBA (Предполагается что исходная строка в ячейке A1)
Определим имя EVAL как =ВЫЧИСЛИТЬ("{""" &ПОДСТАВИТЬ($A$1;"\";""";""")&"""}" )
В ячейки A2:An поместим массивную формулу ={ТРАНСП(EVAL)}
Отмечу, что последний приведённый способ имеет естественное ограничение на длину аргумента функции XLM ВЫЧИСЛИТЬ. Эта длина не может превосходить 256 символов.

Последний раз редактировалось Aent; 13.08.2009 в 01:27.
Aent вне форума Ответить с цитированием
Старый 13.08.2009, 10:09   #7
mephist
Форумчанин
 
Регистрация: 01.05.2009
Сообщений: 200
По умолчанию

Код высший класс! Огромное спасибо. Но я если честно, чуть-чуть не так работает. Мне нужно, чтобы он разделял строку, помещая части пути в ту же строку. А у Aent он размещает их в тот же столбец.
То есть строку D:\fol1\1.txt он размещает так:
D:
fol1
1.txt
А мне нужно, так:
D: fol1 1.txt
Пока мне удалось добиться только такого:
Код:
Public Sub MySpliter(ByVal r As Range)
    If r.Cells.Count > 1 Then Exit Sub
    r.Offset(0, 1).Resize(1, UBound(Split(r.Value, "\")) + 1) = Application.Transpose(Split(r.Value, "\"))
End Sub
Который делает так:
D: D: D:
Подскажите, пожалуйста, что нужно поправить???
mephist вне форума Ответить с цитированием
Старый 13.08.2009, 12:49   #8
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Mephist, в первом посте вы пишите
Цитата:
я хочу, чтобы в строке А2 оказалось "D:"
в строке А3 оказалось "fol1"
в строке А4 оказалось "1.txt"
- это распределение по строкам ...
Если нужно по столбцам, то код
Код:
Public Sub MySpliter(ByVal r As Range)
    If r.Cells.Count > 1 Then Exit Sub
    r.Offset(0, 1).Resize(1, UBound(Split(r.Value, "\")) + 1) = Split(r.Value, "\")
End Sub
Split возвращает"массив-строку" так что транспонировать результат с помощью функции листа Transpose не нужно.

Последний раз редактировалось Aent; 13.08.2009 в 12:53.
Aent вне форума Ответить с цитированием
Старый 25.08.2009, 10:27   #9
mephist
Форумчанин
 
Регистрация: 01.05.2009
Сообщений: 200
По умолчанию

Спасибо большое. Очень помогли!!!
mephist вне форума Ответить с цитированием
Старый 25.08.2009, 12:53   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Или еще проще, например, для ячейки "A1":
Код:
MsgBox Split([A1], "\")(0)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск процессов по заданому критерию imax Помощь студентам 0 01.05.2009 12:32
Удаление строк по определенному критерию Franck Microsoft Office Excel 4 16.02.2009 11:27
Скопировать данные в новую книгу, согласно критерию Iskin Microsoft Office Excel 12 01.12.2008 15:13
Поиск в *.txt по критерию fudzy79 Помощь студентам 5 04.02.2008 09:14
Разделение строки xTANATOSx Общие вопросы Delphi 3 31.10.2007 21:27