Страницы: 1 2 След.
RSS
Select Case: бездействие при определенном значении, Exit Select
 
Добрый день! Если при определенном значении переменной в Select Case не нужно ничего делать, что писать в опции? Exit Select не работает, в хелпе ничего пока не нашел, пока пишу оператор типа x=x, который ничего не делает..
 
Цитата
lucas написал: при определенном значении переменной в Select Case не нужно ничего делать
Ничего не делайте :)
Т.е. Case только для нужных.

Пример покажете, по которому будет понятно, в чем проблема?
 
Цитата
lucas написал:
Если при определенном значении переменной в Select Case не нужно ничего делать, что писать в опции?
ничего. Просто не упоминайте данное значение вовсе. А лучше будет если приведете свой код и значение переменной...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
Case 1
MsgBox "Уря!"
Case 2
MsgBox "Индейская хижина!"
Case 3
Case Elce
MsgBox "Мяу!
"
Изменено: RAN - 07.01.2017 20:21:21
 
Elce - неправильно мяукнул
 
Да и к тому же Case Else как раз произведет действие при любом неупомянутом значении. Кажись, это не совсем то. Думаю надо все же автора дождаться.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
vikttur написал:
Elce - неправильно мяукнул
На лапу наступили. И чё?
При всех, кроме 3, что-то будет, что-то будет...
 
Цитата
vikttur написал: Elce - неправильно мяукнул
Даже буквы почернели
There is no knowledge that is not power
 
И чё к киске пристали?
И так лапка болит!  :cry:
 
Цитата
lucas написал:
Если при определенном значении переменной в Select Case не нужно ничего делать, что писать в опции? ... пока пишу оператор типа x=x, который ничего не делает.
Case пишите, оператор не пишите. Например, ничего не делать при х=1 , -1 или больше 10
Код
  Select Case x
  Case 1, -1, Is > 10 'ничего не делать, можно вводить "case 1,-1,>10", редактор сам вставит Is
  Case Is < 0         'можно писать "case <0"
    y = Func1(x)
  Case Else
    y = Func2(x)
  End Select
Изменено: Казанский - 07.01.2017 21:58:27
 
Казанский, да, это работает, спасибо. Хотя подобная лаконичность выгладит немного странно.. :D
А необходимость выделения этой опции связана с тем, что значения в ней верные, просто с ними ничего делать не надо. В else же ошибочные значения, которых быть не должно, и реакция на эту ошибку.
Изменено: lucas - 08.01.2017 10:23:01
 
Цитата
подобная лаконичность выгладит немного странно...
Почему?
 
Если верных значений много, то задолбаетесь их перечислять...
В таком случае можно использовать select case true, и проверять на наличие значения в словаре, в который предварительно нужно занести все верные значения.
И в общем в таком случае select case тут вообще не нужно, но название темы обязывает применить :)
 
Цитата
Hugo написал: Если верных значений много, то задолбаетесь их перечислять...
Нет, конечно их немного. А как обойтись без селекта, когда разные значения переменной предполагают разные действия (или бездействие)?
Цитата
vikttur написал: подобная лаконичность выгладит немного странно... Почему?
Потому что действие в данном случае все равно есть, и это действие - выход из селекта. Хотя, конечно, при любом другом значении тоже выполняется прямо указанные действия и потом - без всяких допуказаний - выход из селекта. Но, все это, безусловно, просто мои личные ощущения.
Изменено: lucas - 08.01.2017 11:44:33
 
Цитата
lucas написал: выход из селекта
то ли я чего-то не понимаю, то ли Вам мат.часть надо подучить. Выход из Select Case происходит как только любое из перечисленных условий выполняется. Дальнейшая проверка уже не производится. Если ни одно из условий не выполняется - тоже выход, т.к. проверять больше нечего.
Вот и вопрос: зачем перечислять то, без чего и так будет выход? Я понимаю, если бы нужен был выход из всей процедуры(Exit Sub) - тогда да, тогда есть смысл. Но выход из Select...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Да, собственно, вопрос решен. Остальное - просто рассуждения об удобстве или неудобстве синтаксиса vba.
 
Цитата
lucas написал:
рассуждения об удобстве или неудобстве синтаксиса vba
8-0 а синтаксис здесь при чем? Для расширения кругозора: в других языках программирования аналоги Select Case устроены абсолютно так же(+- какие-то возможности условий)...Поэтому речь скорее не об удобстве синтаксиса, а о Ваших личных предпочтениях в его использовании. Так будет точно правильнее.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
если значение соотв. определенному(ым) условию выбрать SELECTом необходимое действие или просто обойти SELECT
if (ПроверитьЗначениеНаОпределенноеУсловие) then
 select case ...
 ....
 end select
end if
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
lucas написал: рассуждения об удобстве или неудобстве синтаксиса vba
:D. А что, есть варианты? В VBA используется только синтаксис VBA
А Вы бы сформулировали новый вопрос по ПРОБЛЕМЕ, а не по способу, которым ее пытаетесь решить. Может там Select со своим Case'ом вообще не нужен. И файл-пример приложите. Но все это в новой теме
Согласие есть продукт при полном непротивлении сторон
 
Цитата
lucas написал:
А как обойтись без селекта, когда разные значения переменной предполагают разные действия
Да очень просто. Использовать If.
 
Цитата
The_Prist написал:
а синтаксис здесь при чем? Для расширения кругозора: в других языках программирования аналоги Select Case устроены абсолютно так же(+- какие-то возможности условий)...Поэтому речь скорее не об удобстве синтаксиса, а о Ваших личных предпочтениях в его использовании. Так будет точно правильнее.
Ну так ведь удобство синтаксиса и складывается из предпочтений пользователей. Вам удобно - мне нет, так что 50/50. А если спросить всех остальных, как думаете, что они скажут в 2017 году по поводу удобства vba :qstn:  Другое дело, что, как справедливо отмечалось выше - а какой выбор? Любишь кататься - люби и саночки возить. Это про Xl и vba.

А вот и про кругозор - C# в студию!  
Код
int caseSwitch = 1;
            switch (caseSwitch)
            {
                case 1:
                    Console.WriteLine("Case 1");
                    break;
                case 2:
                    Console.WriteLine("Case 2");
                    break;
                default:
                    Console.WriteLine("Default case");
                    break;
            }

Есть таки одно отличие, касающееся темы. Это break. Он прямо указывает на выход из switch. И поэтому, если между case и ним пусто, сразу ясно, что это выход без действия. А в vba что? Фиг с маслом после двоеточия. Типа, и так все должны знать, что тут выход , а указатель повесить - жирно будет.

:evil: :excl:
 
Так хочется? Повесьте:
Код
 Select Case x
      Case 1, -1, Is > 10 : GoTo brk         
      Case Is < 0 : y = Func1(x)       
      Case Else :  y = Func2(x)   
End Select

brk:

Обычно GoTo ругают - нарушает логическую последовательность кода. Но здесь не тот случай. GoTo brk выполняет функцию Exit Select
 
Цитата
vikttur написал: GoTo brk выполняет функцию Exit Select
Это, извините, называется штаны через голову надевать.
 
Почему break - хорошо, показанный способ - плохо? break в Си выполняет точно такую же функцию. Я не про способ одевания )

Есть Exit Sub, есть Exit For. Выход из Select не придумали, также как нет и выхода из If/End If - не нужен такой оператор.
По мне, так указатель выхода писать, если и без него прекрасно работает - тоже не ахти желание. В том смысле, что если знаешь, то отсутствие указателя совершенно не мешает. Ведь если не знать об операторе break, то тоже можно проблему надумать.
 
А зачем в C# пишут эти лишние 6 символов? Да ещё перевод строки... :)
 
Цитата
vikttur написал:
нет и выхода из If/End If - не нужен такой оператор.
Так ведь в If две ветки кода разделены Else-ом. А здесь
case1:
case2:
call ДелайДва()

И что должен решить пользователь, не изучивший рутинную матчасть vba, но знающий C#? Правильно, по аналогии - при аргументе=1 будет ДелайДва()! А будет-то - НаВыходСВещами() 8-0
 
А что должен делать пользователь, не изучивший рутинную матчасть  C#, но знающий vba? Посмотрите сообщение №25.  Hugo со знаниями VBA пытается понять (как и Вы здесь), зачем в С# лишнее написано. Ну, серьезно, Вы как-то однобоко смотрите.
Цитата
в If две ветки кода разделены Else-ом
Ага, а в Select Case все разделены Case'ми...
Код
If i Then k=k+1

If Not (i=False)  Then
     k=k+1
End If

If i = True Then
     k=k+1
Else
End If

Три совершенно одинаковые (по логике) записи.
Откуда пользователю знать, что в первой записи значит i? Ведь явно не написано. И нет End If... Беда!
Откуда во второй записи узнать, что делать при невыполнении условия?
Откуда в третьем коде знать, что делать при невыпонении условия? Ах, да, забыл, заменитель break'а надо придумать )

Да в любом языке есть свои извороты синтаксиса. Извините, Вы проблему "высосали  из пальца".
 
Да я вообще проблемы не вижу.. Получил еще вчера ответ на свой вопрос. Поворчал на синтаксис по случаю праздника, вот и все.  :)
 
Цитата
lucas написал: Это break
может тогда уже заодно и справку почитаете там, откуда пример кода взяли, нет? break в C# в switch необходим В КАЖДОМ условии(или другой оператор перехода, вроде return). Без него условие case считается незавершенным и получите ошибку любимого Вами синтаксиса, т.к. внутри switch case нельзя напрямую передавать управление от одной метки к другой. Только через оператор goto case [значение]. Т.е. по сути это всего лишь лишняя логическая строка кода, которая в VB опущена и подразумевается по умолчанию после каждого условия.
А вот так на VBA будет выглядеть приведенное Вами на C# выражение:
Код
    Dim caseSwitch As Long
    caseSwitch = 1
    Select Case caseSwitch
    Case 1
        Debug.Print "Case 1"
    Case 2
        Debug.Print "Case 2"
    Case Else
        Debug.Print "Default case"
    End Select
И выполнит оно в точности тоже, что и Ваше на C#.
Поэтому Ваше высказывание
Цитата
lucas написал: А в vba что? Фиг с маслом после двоеточия
лишь доказывает Вашу неграмотность в обсуждаемом вопросе. Точнее нет, не неграмотность, извиняюсь. Изначально несколько иначе воспринял Вашу фразу про break. Код-то верный и делает все правильно, по задумке. Просто присутствует безосновательность выводов. Синтаксис таков, каков есть. У каждого языка. И где-то есть break, где-то нет. Таких отличий можно такую кучу для каждого языка наковырять, что любой язык можно охаять. Нет идеального для всех - есть предпочтения и привычки :)
Изменено: The_Prist - 08.01.2017 16:40:32
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
lucas написал:
И что должен решить пользователь, не изучивший рутинную матчасть vba, но знающий C#?
он должен изучать мат.часть. И после этого что-то решать. В противном случае любое его решение можно брать под сомнение. Как Ваши, кстати, в данном случае. Ваше высказывание полно идиотизма, извините за выражение. Честно, других слов на ум не приходит.
Почему VBA должен быть интуитивно понятен тому, кто ранее программировал в C#? Это откуда вообще такое требование к языкам программирования? А почему не наоборот? Ведь C# появился куда позднее VBA. VBA был уже в 1997, а C# появился только в 2000. Так может он должен тогда интуитивно напоминать VBA? Я так не считаю. Да и вообще высказывание(которое я процитировал) лишено всякой логики. Если бы все языки были одинаковыми - нафига их так много? У каждого свои плюсы и минусы и свой синтаксис, который программирующий на этом языке обязан знать и учить сам. Знание другого ЯП должно лишь помочь. Но не более.
Это все равно что требовать от Вас, если Вы знаете английский язык, знать еще и арабский. Вот Вы приезжаете в чужую страну отдыхать, по своей воле. Кто кому должен: Вы изучить обычаи и законы страны или народ страны под Вас подстроиться? :)

Кстати, еще про некоторых различия синтаксиса в C# и VBA: в C# не надо каждый раз писать End If, End Select, end еще что-то. Там все выражения заключаются в фигурные скобки. С одной стороны - удобно, фиг опечатаешься оператором. С другой - не во всех редакторах есть подсветка блоков, что в некоторых случаях написания этих блоков резко снижает читаемость кода. Опять же - дело вкуса. И опять же - если я писал на C# это не значит, что перейдя вдруг на VBA я должен требовать от него воспринимать фигурные скобки вместо завершающих операторов. Это ведь неправильно. Это особенность языка, его синтаксис. И я должен следовать ему несмотря на то, что в другом языке это как-то иначе делается.


P.S. Не хочу ничего доказывать, просто Ваши высказывания слишком категоричны, но неверны в том виде, в котором преподносятся. Как применять ту или иную конструкцию - решать Вам. Я не говорил, что не надо делать именно так. Меня интересовало почему хотите сделать именно так. Если бы Вы сказали, что так Вам нагляднее на первых парах изучения VBA - вопрос был бы исчерпан. Но Вы начали говорить о недостатках синтаксиса и пр. Ну согласитесь - не совсем правильно рассуждать так о синтаксисе языка, когда Вы его еще не знаете. По сравнению с ассемблером это вообще сказка  :D Но фанаты ассемблера меня тухлыми яйцами закидают и скажут - VBA отстой. И будут правы, т.к. нет здесь правых и виноватых. Ибо на вкус и цвет фломастеры разные :)  
Изменено: The_Prist - 08.01.2017 16:38:41
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1 2 След.
Читают тему
Наверх