ОБСУЖДЕНИЕ

как вытащить данные из строки?

6 ответов 6,2 тыс.
Автор темы
имеется строка objtxt:
#Кольцевой шов 1 1 1 -1 1800 1800 false -1 0 0 0 40
#Кольцевой шов 2 2 1 1 2000 3800 false -1 0 0 0 40
#Люк 3 3 2 -1 1200 1200 true -2 -35 55 240 28
#Штуцер 4 4 -2 2000 16000 true -2 0 90 110 24

Необходимо считать 2е,5е,6е,9,10 и 11е цифры после слов. Вот такое решил написать:

Код:
Dim element as variant
Dim typ as integer


For Each element In Split(objtxt, "#") 
Dim mas() As String 
mas() = Split(element) 
Typ = CInt(mas(2)) 
call proc
Next

Ругается Subscript out of range(error 9) и указывает на typ.

Как я понял про индекс ругается, сделал вот так:
Код:
For Each element In Split(objtxt, "#") 
Dim mas() As String 
mas() = Split(element) 
Redim mas(11)
Typ = CInt(mas(2)) 
call proc
Next

Тогда тычет туда же, но говорит type mismatch:)

Что делать?) где ошибка?? подскажите пожалуйста.
 
скорее всего, 1й элемент - пустая строка или символы перевода строки...
т.е. можно проверять, что кол-во элементов массива (т.е. Ubound(mas)) не меньше какого-то нужного вам количества и только те значения обрабатывать...
2й вариант с ReDim - это просто "костыли", так лучше не делать (но если сильно хотите, то во 2м варианте надо использовать ReDim Preserve mas(11)).

Добавлено: кстати, получается, что слова перед цифрами у вас непонятно где заканчиваются - могут быть из 1-2 слов, не фиксировано...
 
попробуйте также использовать IsNumeric(mas(2)) - IsNumeric
 
Про 1-2 слова спасибо не заметил:)

IsNumeric(mas(2)) попробовал и в общем false) Как я понял
Код:
mas() = Split(element)
плохо работает

Выводил в textbox и в общем mas(0) правильно получается-"Люк" а mas(1)-это всё остальное в elemente. То есть как такового mas(2) вообще нет) При наличии redim preserve такое возникает..Почему так может быть??
 
2й вариант с ReDim - это просто "костыли", так лучше не делать (но если сильно хотите, то во 2м варианте надо использовать ReDim Preserve mas(11)).
Если Redim не ставить тогда ругается
 
Так со сплитом разобрался спасибо) мой косяк, в документе с пробелами намутил)
 
На основании твоего вопроса и предоставленных тобой данных нацарапал такой код ). Я так понял, что у тебя данные хранятся в текстовом файле, то как ты выдернешь от туда строки ты не спрашиваешь, значит разобрался как из них создать массив строк ).
Код:
Dim a() As String
Dim b As String
b = "#Кольцевой шов 2 2 1 1 2000 3800 false -1 0 0 0 40 " 'наша строка
a = Split(b)											  'разбиваем её на массив
If Val(a(1)) <> False Then								 'Провернем является ли массив
c1 = a(2)											 'с индексом 1 числом
c2 = a(5)
c3 = a(6)
c4 = a(10)
c5 = a(11)
c6 = a(12)
Else													  ' если это слово
c1 = a(3)
c2 = a(6)
c3 = a(7)
c4 = a(11)
c5 = a(12)
c6 = a(13)
End If

этот код работает только под 11 цифр, обрати внимание, что в последней строке у тебя 10 цифр, но я уверен на 100%, что можно найти закономерность благодаря которой можно написать ту процедуру, которую тебе надо!!!

и еще
Код:
mas() = Split(element) 
Redim mas(11)
Typ = CInt(mas(2))
Redim в каком бы ты его виде не писал, нах тут не нужен!!! Во 1, просто Redim mas(11) - обнулит весь полученный тобой раннее массив, а redim preserve (11) - не чего путнего не сделает!!!!!