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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2009, 19:45   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Реализация функций Rexx по работе со строками в VBA

ALL: Очень часто в форуме поднимается вопрос деления строки на отдельные слова/части. Уже много раз на него давали ответ, но к сожалению, по какой-то причине люди не проводят поиск по раним сообщениям. В FIDO вообще-то такое поведение наказуемое, но это к слову... Я решил внести свой не большой вклад в тему, и раньше чем планировал выложить первые две первые процедуры по сабжу. При грамотном их использовании можно творить чудеса. :) Замечание, предложения, комментарии приветствоваться.
Код:
'' *** Words ***
'Определяет количество слов в строковой перемнной.
'Аналог команды Rexx.

'На входе:
'str           - Строковая перменная.

'На выходе:
'words         - Количество слов в переменной.

Function words(str)
   rc = ""          'Переменная для хранений позоции текущего пробела.
   
   words = 0
   str = Application.Trim(str)
   rc = InStr(1, str, " ", 1)
   While rc <> 1
      words = words + 1
      rc = InStr(rc, str, " ", 1) + 1
   Wend
End Function

'' *** Word ***
'Функция возвращает n-ное слово в указаной строке.
'Аналог команды Rexx.

'На входе:
'str           - Строковая перменная.
'Number        - Номер слова.

'На выходе:
'word          - n-ное слово или пустую строку если слова с таким номером нет.

Function word(str, number)
   lenght = 0                  'Переменная для расчета длины слова.
   st = 0                      'Позоция начала слова в строке.
   
   str = Application.Trim(str)
   If number > words(str) Then
      word = ""
   Else
      For n = 1 To number
         st = lenght + 1
         lenght = InStr(st, str, " ", 1)
      Next n
      If lenght = 0 Then
         word = Mid(str, st)
      Else
         lenght = lenght - st
         word = Mid(str, st, lenght)
      End If
   End If
End Function
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.03.2009, 19:55   #2
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Пример использования:

Код:
'Характеристиска части.
Const Чс_Характ = "2 3"
'                                 | | Смещение в столбцах в блоке (Y).
'                                 | Номер строки на листе (X).
Выбор = Лист.Cells(Val(word(Чс_Характ, 1)), Смещение + Val(word(Чс_Характ, 2)))
Где:
Смещение - рассчитанное ранее смещение от края листа.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.03.2009, 20:33   #3
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

несколько проще это реализуется..
(Вы как раз не воспользовались поиском )

Код:
Sub Макрос1()
On Error Resume Next
Dim s$, sr$, i&, n&
i = 5
s = "a    b         c"
s = WorksheetFunction.Trim(s)
    n = UBound(Split(s, " ")) + 1
    sr = Split(s, " ")(i - 1)
End Sub
где
s - текстовая строка
n - количество слов в s
sr - i-е слово в s(или "", если слов меньше i)
slan вне форума Ответить с цитированием
Старый 12.03.2009, 21:41   #4
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от slan Посмотреть сообщение
несколько проще это реализуется..
(Вы как раз не воспользовались поиском )

Код:
Sub Макрос1()
On Error Resume Next
Dim s$, sr$, i&, n&
i = 5
s = "a    b         c"
s = WorksheetFunction.Trim(s)
    n = UBound(Split(s, " ")) + 1
    sr = Split(s, " ")(i - 1)
End Sub
Спасибо! А все потому что в моей литературе нет ни слова про эти команды... Где можно почитать об это подробнее кроме help'а?
Обновленные версии процедур:
Код:
'' *** Words ***
'Определяет количество слов в строковой перемнной.
'Аналог команды Rexx.

'На входе:
'str           - Строковая перменная.

'На выходе:
'words         - Количество слов в переменной.

Function words(str)
   
   words = UBound(Split(Application.Trim(str), " ")) + 1
End Function

'' *** Word ***
'Функция возвращает n-ное слово в указаной строке.
'Аналог команды Rexx.

'На входе:
'str           - Строковая перменная.
'Number        - Номер слова.

'На выходе:
'word          - n-ное слово или пустую строку если слова с таким номером нет.

Function word(str, number)
   
   On Error Resume Next
   word = ""
   word = Split(Application.Trim(str), " ")(number - 1)
   
End Function
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 13.03.2009, 11:45   #5
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

так чуть "правильнее"
Код:
Function nwords(str As String) As Long
    nwords = UBound(Split(Application.Trim(str), " ")) + 1
End Function
Function word(str As String, number As Long) As String
    On Error Resume Next
    sr = Split(Application.Trim(str), " ")(number - 1)
End Function
slan вне форума Ответить с цитированием
Старый 13.03.2009, 16:21   #6
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от slan Посмотреть сообщение
так чуть "правильнее"
Код:
Function nwords(str As String) As Long
    nwords = UBound(Split(Application.Trim(str), " ")) + 1
End Function
Function word(str As String, number As Long) As String
    On Error Resume Next
    sr = Split(Application.Trim(str), " ")(number - 1)
End Function
все таки не nwords, а words. Во первых так она названа в Рекс, а во вторых ИМХО так все же правильнее, можно прочитать как "слов в (str)".
И подправить:
sr = Split(Application.Trim(str), " ")(number - 1), на
word = Split(Application.Trim(str), " ")(number - 1)

Странно у меня до этого без строки word="" вчера выдавал нуль, если слова под таким номером нет. А сегодня правильно, выдает пустую строку.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 14.03.2009, 13:08   #7
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

я ж и имел ввиду, что "правильнее" объявлять типы явно!
slan вне форума Ответить с цитированием
Старый 15.03.2009, 13:32   #8
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от slan Посмотреть сообщение
я ж и имел ввиду, что "правильнее" объявлять типы явно!
Как (уже) многолетний пользователь Rexx считаю, что типы данных - зло. В Rexx'се они отсутствую как класс, что значительно расширяет возможности, а конструкции делают более красивыми, повышается читабельность листинга. В общем одни плюсы. :)))
Вот последняя версия процедур:
Код:
Function nwords(str) As Long
    nwords = UBound(Split(Application.Trim(str), " ")) + 1
End Function
Function word(str, number) As String
    On Error Resume Next
    word = Split(Application.Trim(str), " ")(number - 1)
End Function
Как видно из заголовка убраны определения типов передоверяемых данных. В предыдущем варианте, комп выдавал ошибку при попытке передать в процедуры константы, и пример приведенный во втором письме не работал.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 15.03.2009, 21:51   #9
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

может быть код будет и красивше, но работать будет дольше..

я выбираю эффективность.
slan вне форума Ответить с цитированием
Старый 16.03.2009, 04:52   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

tae1980
Цитата:
Как (уже) многолетний пользователь Rexx считаю, что типы данных - зло
А штаны себе тоже 60 размере покупаешь?
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация функций из библиотеки stdio.h Blade Общие вопросы C/C++ 9 23.11.2008 12:35
Реализация функций синхронизации потоков. натка Помощь студентам 1 03.01.2008 15:26
Проблеммы с использованием функций работы со строками Copy и Pos Soso Общие вопросы Delphi 13 09.08.2007 16:01
нужна помощь по работе с строками файлов... Ruffian Общие вопросы Delphi 9 15.11.2006 16:05