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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2013, 18:41   #1
Stem79
Пользователь
 
Регистрация: 29.01.2013
Сообщений: 43
Лампочка VBA: обработка строки ?

Необходимо реализовать макрофункцию по спецификации:

Function ПАРСИНГ (r1 As String, v1 As Double) as Double

r1 - это строка вида 0-5;1-2;2-0;3-2;4-0;5-1;
v1 - числовое значение;

первое число: число до дефиса;
второе число: число после дефиса;

алгоритм функции:
1. из каждого первого числа строки r1 вычесть v1 и результат возвести в квадрат;

получится новый ряд r1' вида: (0-v1)^2-5;(1-v1)^2-2;...(5-v1)^2-1;

2. каждое первое число ряда r1' умножить на второе число ряда r1'

получится ряд r1'' (0-v1)^2*5;(1-v1)^2*2;...(5-v1)^2*1;

3. сложить числа ряда r1'', каждое число разделено знаком ";"

получится сумма, которую должна вернуть функция ПАРСИНГ.

Как это реализовать?

Спасибо!
Stem79 вне форума Ответить с цитированием
Старый 07.02.2013, 19:48   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Function Parsing(s As String, v As Double) As Double
  Parsing = eq(s, v, 0)
End Function

Function eq(s As String, v As Double, i As Long) As Double
  If Len(s) > 4 * i Then eq = (Val(Mid(s, i * 4 + 1, 1)) - v) ^ 2 * Val(Mid(s, i * 4 + 3, 1)) + eq(s, v, i + 1)
End Function

Sub main()
  MsgBox Parsing("0-5;1-2;2-0;3-2;4-0;5-1;", 3)
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 07.02.2013 в 19:55.
IgorGO вне форума Ответить с цитированием
Старый 07.02.2013, 19:49   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

А вот и мой вариант:

Код:
Sub test()
    Debug.Print ПАРСИНГ("0-5;1-2;2-0;3-2;4-0;5-1;", 2)
End Sub

Function ПАРСИНГ(r1 As String, v As Double) As Double
    For Each txt In Split(r1, ";")
        If txt Like "*#-#*" Then
            v1& = Val(Split(txt, "-")(0))
            v2& = Val(Split(txt, "-")(1))
            ПАРСИНГ = ПАРСИНГ + (v1 - v) ^ 2 * v2
        End If
    Next
End Function
PS: Игорь, ты научился вызывать у людей вывих мозга не только формулами, но теперь уже и макросами? ))
Я вообще не понял, как работает твой вариант с рекурсией

Последний раз редактировалось EducatedFool; 07.02.2013 в 19:55. Причина: исправил ошибку в коде
EducatedFool вне форума Ответить с цитированием
Старый 07.02.2013, 19:58   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

или так:
Код:
Function Parsing(s As String, v As Double, Optional i As Long = 0) As Double
    If Len(s) > 4 * i Then Parsing = (Val(Mid(s, i * 4 + 1, 1)) - v) ^ 2 * Val(Mid(s, i * 4 + 3, 1)) + Parsing(s, v, i + 1)
End Function

Sub main()
  MsgBox Parsing("0-5;1-2;2-0;3-2;4-0;5-1;", 3)
End Sub
формально обьявление функции немного изменилось, но вызов с теми же двумя параметрами, что и описании задачи
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 07.02.2013, 20:03   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Я тоже могу покороче)

Код:
Sub test()
    Debug.Print ПАРСИНГ("0-5;1-2;2-0;3-2;4-0;5-1;", 2)
End Sub

Function ПАРСИНГ(r1 As String, v As Double) As Double: On Error Resume Next: For Each txt In Split(r1, ";"): ПАРСИНГ = ПАРСИНГ + IIf(txt Like "*#-#*", (Val(Split(txt, "-")(0)) - v) ^ 2 * Val(Split(txt, "-")(1)), 0): Next: End Function
EducatedFool вне форума Ответить с цитированием
Старый 07.02.2013, 20:06   #6
Stem79
Пользователь
 
Регистрация: 29.01.2013
Сообщений: 43
По умолчанию

Круто, спасибо парни!
Stem79 вне форума Ответить с цитированием
Старый 07.02.2013, 20:15   #7
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

До кучи
Код:
Function ПАРСИНГ(ByVal r1 As String, v1 As Double) As Double
ПАРСИНГ = Evaluate("(" & Replace(Replace(r1, ";", "+("), "-", "-" & Str(v1) & ")^2*") & "0)")
End Function

Sub test()
Debug.Print ПАРСИНГ("0-5;1-2;2-0;3-2;4-0;5-1;", 3)
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 07.02.2013, 20:35   #8
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию


Первым в забеге к финишу пришёл Казанский
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 07.02.2013, 20:46   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Согласен с Серегой.

Леша, красиво! что тут еще скажешь. Меня прет от твоего варианта, будто это я написал.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 07.02.2013, 20:48   #10
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Зато у меня с картинкой!
Код:
Option Explicit
Dim ВЫРАЖЕНИЕ

Sub ВЫЗОВ()
    Dim result
    result = ПАРСИНГ("0-5;1-2;2-0;3-2;4-0;5-1; ", 0)
    MsgBox ВЫРАЖЕНИЕ & " = " & result
End Sub

Function ПАРСИНГ(r1 As String, v1 As Double) As Double
Dim r, rr, units, newbound, i
units = Split(Trim(r1), ";") 'разбили r1 на элементы массива units()
'Trim обрезает пробелы по краям строки

While Not Left(CStr(units(UBound(units))), 1) Like "[0-9]"
'пока последний элемент начииется не с цифры (т. е. пуст либо это пробел)
    newbound = UBound(units) - 1
    ReDim Preserve units(0 To newbound) 'убрали из массива units пустой «хвост»
Wend
'теперь имеем массив units - из элементов вида "X-Y" (где X начинается с цифры)

r = units                   'создали в r копию массива units
ReDim rr(0 To newbound)     'создали в rr аналог массива units (по размерности)

For i = 0 To UBound(units)
    r(i) = Val(units(i))    'здесь элементами массива сновятся 1-е эл-ты units (до -)
    rr(i) = (r(i) - v1) ^ 2 '1-е элементы нового ряда r1' (алгоритм, пункт 1)
    units(i) = rr(i) & Mid(units(i), InStr(units(i), "-"))
    'здесь мы в i-м элементе заменили на rr(i) число, стоящее до дефиса
    
    units(i) = Replace(units(i), "-", "*") 'замена дефиса на звёздочку в элементе i
        
        MsgBox "rr(" & i & ") = " & rr(i) & vbCr & vbCr & _
                "units(" & i & ") = " & units(i) & vbCr & vbCr & _
        Application.Evaluate(units(i))
Next

    ВЫРАЖЕНИЕ = Join(units, "+") 'соединяем плюсиками - получаем вычисляемое выражение
    ПАРСИНГ = Application.Evaluate(ВЫРАЖЕНИЕ) 'выдаём сумму
End Function
Изображения
Тип файла: jpg мягко-выражаясь...jpg (18.5 Кб, 132 просмотров)
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка строк на VBA AnatolyF Microsoft Office Excel 6 12.05.2012 14:43
VBA: целочисленная арифметика, массивы, обработка строк kabum13 Помощь студентам 0 10.12.2010 16:32
VBA outlook обработка входящих сообщений Drek Помощь студентам 2 18.07.2010 04:19
обработка строки Bek Помощь студентам 1 27.02.2009 12:46
Обработка строки Staxxx Общие вопросы C/C++ 2 03.01.2009 12:30