Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вытащить число из текста, Excel, VBA 
:(
    Опции темы
Loskutov
Дата 13.8.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 12.9.2007

Репутация: нет
Всего: нет



Проблема В ячейке Excel текст (текст в ячейках разный, разной длины), где то в середине текста число которое может состоять из разного количества цифр. Но это чило  идет после слов "КОЛ: ". Подскажите пожалуйста каким образом это число вытащить из текста в отдельную ячейку.
Большое спасибо за дельные советы;)

Добавлено через 11 минут и 36 секунд
Может каким нить образом посчитать знаки до числа т.е. до 0123456789; потом знаки до конца числа... 
Помоему уже были похожие топики но не могу найти... Подскажите плз Ваще надо сино
PM MAIL   Вверх
Akina
Дата 13.8.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(Loskutov @  13.8.2008,  20:15 Найти цитируемый пост)
где то в середине текста число которое может состоять из разного количества цифр. Но это чило  идет после слов "КОЛ: ". Подскажите пожалуйста каким образом это число вытащить из текста в отдельную ячейку.

Код

Num = Val(Mid(Str, Instr(Str,"КОЛ: ")+5))



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Baha_Ahmed
Дата 13.8.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 21.12.2007

Репутация: нет
Всего: нет



Цитата(Loskutov @ 13.8.2008,  19:15)
Проблема В ячейке Excel текст (текст в ячейках разный, разной длины), где то в середине текста число которое может состоять из разного количества цифр. Но это чило  идет после слов "КОЛ: ". Подскажите пожалуйста каким образом это число вытащить из текста в отдельную ячейку.
Большое спасибо за дельные советы;)

Добавлено @ 19:27
Может каким нить образом посчитать знаки до числа т.е. до 0123456789; потом знаки до конца числа... 
Помоему уже были похожие топики но не могу найти... Подскажите плз Ваще надо сино

"где то в середине текста число которое может состоять из разного количества цифр."

в таких случаях надо всегда писать универсальные коды

 smile 

Код

во-первых надо запустить цикл для считывания строки
for  i=1  to len(str) 
 ' необходимо вытаскивать по символу и проверять ее на цифру если да то добавлять е
Dim i, str, strnum
For i = 1 To Len(Text1.Text) ' где Text1.Text содержит строку с цифрами, а len функ-ция для длины строки
    str = Mid(Text1.Text, i, 1) ' здесь хранятся символы из строки
    Debug.Print str ' можно проверить лежит ли здесь символ
    strnum = IsNumeric(str)  ' это функ-ция проверяет яв-ся ли символ числом
    If strnum = True Then     ' если да 
        Debug.Print str
        Text2.Text = Text2.Text + str 'то собираем их  в Text2.Text 
    Else
         Text2.Text = Text2.Text + " "
    End If
Next i


такой код универсален где бы не лежали цифры они буду собраны воедино
можно его конечно модифицировать но это уже за тобой!!!!

Добавлено через 3 минуты и 35 секунд
Цитата(Akina @ 13.8.2008,  20:38)
Код

Num = Val(Mid(Str, Instr(Str,"КОЛ: ")+5))

а вдруг чисел не пять а больше и не после слова "Кол"  smile 
PM MAIL   Вверх
Akina
Дата 13.8.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(Baha_Ahmed @  13.8.2008,  21:59 Найти цитируемый пост)
а вдруг чисел не пять а больше 

Прежде чем делать замечания, неплохо бы понять, что именно делает код. Дабы не сказать глупость. Заодно неплохо бы понять, нужно ли автору темы решение ТВОЕЙ проблемы.

Цитата(Baha_Ahmed @  13.8.2008,  21:59 Найти цитируемый пост)
такой код универсален 

Твой код просто заменяет не-цифры на пробелы. Пользы в нем - ноль (десятичная точка? унарный минус? экспоненциальная форма?), да к тому же груда синтаксических ошибок.

Добавлено через 3 минуты и 7 секунд
Loskutov, проверь на числах с плавающей точкой - могут быть проблемы с десятичным разделителем в региональных настройках. Возможно, потребуется заменить Val на CInt (CLng, CDbl...)


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Baha_Ahmed
Дата 14.8.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 21.12.2007

Репутация: нет
Всего: нет



Цитата(Akina @ 13.8.2008,  22:40)
Твой код просто заменяет не-цифры на пробелы. Пользы в нем - ноль (десятичная точка? унарный минус? экспоненциальная форма?), да к тому же груда синтаксических ошибок.

Я вижу ты гордый Мякина!!!!
 по поводу не-цифр,
этот кусок кода что делает тормоз!!!
Код

If strnum = True Then     ' если да 
        Debug.Print str
        Text2.Text = Text2.Text + str 'то собираем их  в Text2.Text 
.....

[removed by moderator]
а по поводу пробелов можно просто этот момент закоментировать.
будет выглядеть вот так:[code=nocolor]
Код

Dim i, str, strnum
For i = 1 To Len(Text1.Text) ' где Text1.Text содержит строку с цифрами, а len функ-ция для длины строки
    str = Mid(Text1.Text, i, 1) ' здесь хранятся символы из строки
    Debug.Print str ' можно проверить лежит ли здесь символ
    strnum = IsNumeric(str)  ' это функ-ция проверяет яв-ся ли символ числом
    If strnum = True Then     ' если да 
        Debug.Print str
        Text2.Text = Text2.Text + str 'то собираем их  в Text2.Text 
    'Else
     '    Text2.Text = Text2.Text + " "
    End If
Next i

[removed by moderator]
если ты исправишь мой код я только буду рад.

Добавлено @ 10:48
Цитата(Baha_Ahmed @ 14.8.2008,  10:40)
Пользы в нем - ноль (десятичная точка? унарный минус? экспоненциальная форма?), да к тому же груда синтаксических ошибок.

а эти моменты что ты перечислил просто пусть добавит в условия и их тоже либо соберут "в число" либо их оттуда изымут. Я же сказал, что его можно модифицировать. 
[removed by moderator]

Добавлено @ 10:55
Цитата(Loskutov @ 13.8.2008,  19:15)
Может каким нить образом посчитать знаки до числа т.е. до 0123456789; потом знаки до конца числа... 
Помоему уже были похожие топики но не могу найти... Подскажите плз Ваще надо сино

Что и требовалось доказать!!!! Чел указал конкретную ситуацию или одну из них. 
[removed by moderator]


Это сообщение отредактировал(а) Akina - 14.8.2008, 12:07
PM MAIL   Вверх
neiron
Дата 14.8.2008, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: 3
Всего: 4



Baha_Ahmed, а что будет если в строке не только после символов КОЛ будут идти циферки? 
И Akina тебе правильно сказал, что сначала надо посмотреть что же в коде написано, а не просто заявлениями раскидываться. 
Если уж пишешь универсальный код, то пиши его до конца;)

Это сообщение отредактировал(а) neiron - 14.8.2008, 11:00
PM MAIL   Вверх
Baha_Ahmed
Дата 14.8.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 21.12.2007

Репутация: нет
Всего: нет



Цитата(neiron @ 14.8.2008,  10:57)
Baha_Ahmed, а что будет если в строке не только после символов КОЛ будут идти циферки?

Это надо к Мякине и обратиться. Елки палки вы все такие хакеры, ну добавь к коду условия .... какие ты хошь, там же его как хочь, какие хошь можно условия ставить!!! Я предложил только кусок, а там уж.... этот чел сам сможет все сделать, главное тело дал.

Добавлено через 11 минут и 37 секунд
Цитата(neiron @ 14.8.2008,  10:57)
 сначала надо посмотреть что же в коде написано

а что там написано не то что я имел в виду что ли. Ты сам почитай VB функции если что :


Функция InStr(In String) служит для поиска номера символа(номера байта для InStrB), с которого начинается в заданной строке образец поиска. Поиск идет от указанной позиции слева направо. Поиск вхождения одной строки в другую весьма часто используемая операция. Нумерация символов всегда начинается с единицы

Функция Mid(Middle) используется для считывания заданного числа символов или байт подряд от заданной позиции в строке слева направо. Нумерация символов в строке всегда начинается с единицы


Мякина предлагает захватить со слова Кол пять идущих после цифр, что то не так?

 если что не так так возьми и прокомментируй!!!
PM MAIL   Вверх
neiron
Дата 14.8.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: 3
Всего: 4



ты сам ответил на свой вопрос:

Функция Mid(Middle) используется для считывания заданного числа символов или байт подряд от заданной позиции в строке слева направо. Нумерация символов в строке всегда начинается с единицы

то бишь 

Num = Val(Mid(Str, Instr(Str,"КОЛ: ")+5))
значит что вырезаем символы из строки Str начиная с символа, который начинает последовательность "КОЛ: " и до КОНЦА строки. 5 - указывает на длину выржения "КОЛ: ". Всё что идёт после пробела вырезается. 

Правда, есть ошибочка у вас обоих, ибо в задаче не сказано, что после выражения КОЛ: не может быть других выражений, равно как и перед ним. Т.е. вволне допустима строка:
ВА:13413 КОЛ: 342 ВАЛ: 343

В случае Акины вытащится 342 ВАЛ: 343 (и, как я понимаю, дальше выскочит ошибка)
В случае Ахмеда (c учётом последних изменений): 13413342343 (что есть некорректный результат)


Мой вариант:

Код

const startConst = "КОЛ: "
const endConst = "ВАЛ: "

if (endConst <> vbNullString) then
    Num = Val(Mid(Str, Instr(Str, startConst)+startConst.length(), Instr(Str, endConst)))
else
    Num = Val(Mid(Str, Instr(Str, startConst)+startConst.length()))
end if


За валидность кода не ручаюсь, ибо не имею под рукой компилятора. 
Можно сделать и более универсальным, но этого не требуется по условию.
PM MAIL   Вверх
Akina
Дата 14.8.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



neiron, ты почти прав.


Цитата(neiron @  14.8.2008,  12:57 Найти цитируемый пост)
в задаче не сказано, что после выражения КОЛ: не может быть других выражений, равно как и перед ним. Т.е. вволне допустима строка:
ВА:13413 КОЛ: 342 ВАЛ: 343
В случае Акины вытащится 342 ВАЛ: 343 (и, как я понимаю, дальше выскочит ошибка)

Val() игнорирует все символы, начиная с первого не-числового. Посему неважно, есть еще какие-то символы после "КОЛ: [значение]" или нет. Остальное верно.

Добавлено @ 12:04
Цитата(neiron @  14.8.2008,  12:57 Найти цитируемый пост)
не имею под рукой компилятора.

Интерпретатор VBA, имеющийся в любом Офисном приложении (Аксесс, Ворд, Эксель и пр.) вполне подойдет.

Добавлено @ 12:08

M
Akina
За хамство, нецензурные выражения и обсуждение действий модератора в не предназначенном для этого разделе пользователь Baha_Ahmed лишен права постинга на 1 сутки.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
neiron
Дата 15.8.2008, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: 3
Всего: 4



Akina, о, точно. Я о VBA забыл совсем)) 
А если Val работает так, то вообще отлично. Проблема в одну строчку.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.