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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2012, 12:11   #1
mrMad-Cat
Пользователь
 
Регистрация: 06.01.2012
Сообщений: 33
Смех VBA Упрощение конструкции соответсвий

Помогите пожалуйста упростить конструкцию в VBA.
Код:
If a="01" Then b = "99" End If
If a="02" Then b = "88" End If
If a="03" Then b = "77" End If...
Я так понимаю что это можно сделать как-то масивами но как не знаю.
Думал что-то такого типа но это не работает:
Код:
If a=("01";"02";"03") Then b = ("99";"88";"77") End If

Последний раз редактировалось mrMad-Cat; 12.07.2012 в 12:13.
mrMad-Cat вне форума Ответить с цитированием
Старый 12.07.2012, 12:37   #2
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

b = 110 - 11*a
slan вне форума Ответить с цитированием
Старый 12.07.2012, 12:37   #3
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Если VBA Excel, то можно использовать функции листа ПРОСМОТР, ВПР, ПОИСКПОЗ и т.д.
Код:
a = "02"
b = Application.Lookup(a, Array("01", "02", "03"), Array("99", "88", "77")) 'ПРОСМОТР
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 12.07.2012, 12:46   #4
mrMad-Cat
Пользователь
 
Регистрация: 06.01.2012
Сообщений: 33
По умолчанию

slan я не это имел ввиду. Вы слишком прям опосмотрели на это дело, но спаисбо за внимание. Смысл в том чо я не случайно взял цифры в скобки. Числа я в примере выбрал случайные, но вы обнаружили в них логику
Меня интересуют текстовые значения и математической формулой тут не обойтись:
Код:
If a="01" Then b = "январь" End If
If a="02" Then b = "февраль" End If
If a="03" Then b = "март" End If...
Казанский это Outlook. Увы.
mrMad-Cat вне форума Ответить с цитированием
Старый 12.07.2012, 12:58   #5
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Вам название месяца надо получить по его номеру, или это опять совпадение?
Код:
a = "02"
b = LCase(Format(a & "/1/12", "MMMM"))
Или так
Код:
mon = Split("январь февраль март") 'допишите сами
a = "02"
b = mon(a - 1)
exceleved@yandex.ru Яндекс.Деньги: 410011500007619

Последний раз редактировалось Казанский; 12.07.2012 в 13:01.
Казанский вне форума Ответить с цитированием
Старый 12.07.2012, 13:01   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Код:
Sub tt()
    Dim arr, a$, b$
    arr = Split("январь февраль март")
    a = InputBox("Enter a :)")
    b = arr(--a - 1)
    MsgBox b
End Sub

Sub ttt()
    Dim a$, b$
    a = InputBox("Enter a :)")
    b = Split("январь февраль март")(--a - 1)
    MsgBox b
End Sub
Упс, чуть подправил - в первой версии лишний пробел закрался
И бинарное отрицание вообще-то лишнее, ну пусть остаётся...

А вариант Казанского зависим от локали
У меня всё время январь рисовал.
А вот так работает (не не по-русски):
Код:
b = LCase(Format("01/" & a & "/12", "MMMM"))
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 12.07.2012 в 13:34.
Hugo121 вне форума Ответить с цитированием
Старый 12.07.2012, 13:01   #7
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

в аутглюке тоже есть MonthName Function
b=monthname(a)
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 12.07.2012, 13:31   #8
mrMad-Cat
Пользователь
 
Регистрация: 06.01.2012
Сообщений: 33
По умолчанию

Казанский, Да, это не совпадение, меня действительно интересуют месяца, но вопрос я задавал всетаки более общий так как интересно знать более универсальное решение.

Вариант kuklp подкупает своей гениальной простотой, только есть пробелма с форматом дат в системе. На украинской системе название месяца будет украинское, на английской - английское и т.п. Нужно русское. Можно возможно усложнить что-то в форматах.

Hugo121, спасибо, сейчас попробую осмыслить ваш вариант...
mrMad-Cat вне форума Ответить с цитированием
Старый 12.07.2012, 13:44   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ещё такой универсальный вариант:

Код:
Sub tt()
    Dim oDict, a, b, i&, x

    Set oDict = CreateObject("scripting.dictionary")
    
    'исходные пары данных, можно массивы задать иначе или брать из файла/листа
    a = Split("aa bb cc")
    b = Split("январь февраль март")
    
    'наполняем словарь
    For i = 0 To UBound(a)
        oDict.Item(a(i)) = b(i)
    Next
    
    'пользуемся (ввести aa или bb или cc)
    x = InputBox("Enter a :)")
    MsgBox oDict.Item(x)
    
End Sub
Пар может быть сколько угодно, хоть миллион
Если словарь получается большим, то его есть смысл сделать публичным и заполнить один раз (при открытии файла или при первом вызове), а дальше только использовать (если конечно он нужен больше одного раза за сеанс )
Тогда и массивы нужны только один раз, при заполнении словаря - т.е. эту процедуру есть смысл вынести отдельно.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 12.07.2012 в 13:49.
Hugo121 вне форума Ответить с цитированием
Старый 12.07.2012, 14:06   #10
mrMad-Cat
Пользователь
 
Регистрация: 06.01.2012
Сообщений: 33
По умолчанию

Ну что ж, я использовал вариант Hugo121:
Код:
b = Split("январь февраль март апрель май июнь июль август сентябрь октябрь ноябрь декабрь")(--a - 1)
Для моего случая эт осамый рабочий вариант. Хотя до сих пор не могу понять суть этой функции и почему нужно двойное отрицание и еще и отнимание еденицы.

Чего-то мне казалось что универсальный вариант будет намного проще. Хотя если присмотреться он не такой уж и сложный ведь сводится до 6 строчек:
Код:
Set oDict = CreateObject("scripting.dictionary")
a = Split("aa bb cc")
b = Split("январь февраль март")
For i = 0 To UBound(a)
oDict.Item(a(i)) = b(i)
Next
Hugo121, kuklp, Казанский, slan, спасибо за участие и идеи.
mrMad-Cat вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Упрощение кода. Паскаль. ArsGo Помощь студентам 4 21.09.2011 03:10
суммирование по двум критериям по 2-м спискам соответсвий kievlyanin Microsoft Office Excel 11 03.08.2011 18:14
VBA.Циклы.Линейные алгоритмы.Условные конструкции. Екатерина нск Помощь студентам 1 17.01.2010 17:37
Упрощение кода R@Ziel Помощь студентам 0 26.12.2009 20:27
Упрощение дроби k1r1ch Общие вопросы Delphi 2 10.10.2009 16:16