Страницы: 1
RSS
VBA несколько условий для одной переменной., Обучение VBA.
 
Здравствуйте. Есть задание:

Дано число. Если оно от 2 до 5 включительно, то увеличить его на 10. Если оно от 7 до 40, то уменьшить на 100. Если оно не более 0 или более 3000, то увеличить в 3 раза (то есть умножить на 3). Иначе занулить это число.


Я споткнулся уже на первом условии (>= 2 и <= 5).

За весь код буду благодарен.
 
Georgetta Monson, здравствуйте
Код
Sub t()
Dim n#

If n >=2 And n <=5 Then n = n +10: Exit Sub
'...
If n <=0 Or n>3000 Then n = n *3: Exit Sub
n=0
End Sub
Добавьте второе условие по аналогии
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Код
Function ChangeA(a)
  If a >= 2 And a <= 5 Then
    ChangeA = a - 10
  ElseIf a > 7 And a < 40 Then
    ChangeA = a - 100
  ElseIf a <= 0 Or a > 3000 Then
    ChangeA = a * 3
  Else
    ChangeA = 0
  End If
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
И в качестве домашнего задания VBA Select и VBA Switch.
Изменено: sokol92 - 30.09.2022 17:00:53
Владимир
 
sokol92, А вот не согласен я . Для данных условий эти методы не совсем подходят.
даже такая конструкция не спасет
Код
a = 10
Select Case True
Case a >= 2 And a <= 5
    ChangeA = a - 10
Case a > 7 And a < 40
    ChangeA = a - 100
Case a <= 0 Or a > 3000
    ChangeA = a * 3
Case Other
    ChangeA = 0
End Select
Изменено: БМВ - 30.09.2022 19:50:32
По вопросам из тем форума, личку не читаю.
 
Здравствуйте, Михаил! Это не для нас с Вами домашние задания.  :)
Код
Function ChangeA(a) As Double
  Select Case a
    Case 2 To 5
      ChangeA = a - 10
    Case 7, 40
    Case 7 To 40
      ChangeA = a - 100
    Case Is <= 0, Is > 3000
      ChangeA = a * 3
  End Select
End Function

Sub Test()
  Dim v
  For Each v In Array(-1, 5, 7, 8, 40, 500, 5000)
    Debug.Print v, ChangeA(v)
  Next v
End Sub

Кстати, формулировки  "от 7 до 40" по умолчанию трактуются, как включающие в себя границы.
Владимир
 
sokol92, приветствую!
Скорее всего, вместо
Код
Case 7, 40
Case 7 To 40
    ChangeA = a - 100
вы хотели написать
Код
Case 7, 40
    ChangeA = a - 100
Case 7 To 40
    ChangeA = a - 100
— иначе сработает не так, как нужно.
Ну и, конечно, в таком случае, короче и понятнее будет через Case Is, как вы показали ниже.

Сравнение скоростей: Метки незначительно быстрее If Then, который незначительно быстрее Select Case, который значительно быстрее Switch (это функция и она проверяет все пары аргументов).
При большом количестве вариантов, рекомендуется добавлять метод деление пополам для существенного сокращения перебора.
Все методы, кроме функции, очень и очень быстрые.
Изменено: Jack Famous - 03.10.2022 11:32:07
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Дополню ветку, наверное не самым быстрым, но одним из возможных способом
a = a + 10 * ((a >= 2) * (a <= 5)) - 100 * ((a > 7) * (a < 40)) - 2 * a * ((a < 0) + (a > 3000))
В VB True эквивалентно -1, в формулах Экселя = 1, ложь и там и там 0
Страницы: 1
Наверх