Страницы: 1
RSS
конструкция Select Case
 
Здравствуйте.  
В одном из кодов, мне посоветовали применить конструкцию Select Case.  
Подскажите или покажите на небольшом примере, как применить конструкцию Select Case, так как с этой проверкой не знаком.  
Условие:  
“Если” в ячейки [n1] меняется свойство Value, “Затем” в ComboBox изменяется свойство RowSource, и так далее.
‘...  
“Если” в TextBox свойство Value=”” “Затем” в ComboBox свойство Value=”” “Еще” ComboBox свойство Value=[z1].Value
 
А в справку глянуть? Там и пример:  
 
Dim Number  
Number = 8    ' Initialize variable.  
Select Case Number    ' Evaluate Number.  
Case 1 To 5    ' Number between 1 and 5, inclusive.  
   Debug.Print "Between 1 and 5"  
' The following is the only Case clause that evaluates to True.  
Case 6, 7, 8    ' Number between 6 and 8.  
   Debug.Print "Between 6 and 8"  
Case 9 To 10    ' Number is 9 or 10.  
Debug.Print "Greater than 8"  
Case Else    ' Other values.  
   Debug.Print "Not between 1 and 10"  
End Select
Я сам - дурнее всякого примера! ...
 
Это в справке такой пример?  
Интересно... А если вдруг нумбер дробный получился? :)
 
Например, на 8,5 врёт...
 
Ничего не понял  
На моем примере нельзя показать  
         
If [N1].Value = "a" Then ComboBox.RowSource = "=$H$17:$H$20"
If [N1].Value = "b" Then ComboBox.RowSource = "=$H$22:$H$25"
If [N1].Value = "c" Then ComboBox.RowSource = "=$H$27:$H$27"
'...  
If TextBox.Value = "" Then .ComboBox.Value = "" Else ComboBox.Value = [z1].Value
 
Select Case [N1].Value ' Evaluate Number.
   Case "a"  
       ComboBox.RowSource = "=$H$17:$H$20"  
   Case "b"  
       ComboBox.RowSource = "=$H$22:$H$25"  
   Case "c"  
       ComboBox.RowSource = "=$H$27:$H$27"  
   End Select  
   '...  
   If TextBox.Value = "" Then .ComboBox.Value = "" Else ComboBox.Value = [z1].Value
 
 
86677
Я сам - дурнее всякого примера! ...
 
{quote}{login=KuklP}{date=30.08.2010 10:35}{thema=}{post}Select Case [N1].Value ' Evaluate Number.
   Case "a"  
       ComboBox.RowSource = "=$H$17:$H$20"  
   Case "b"  
       ComboBox.RowSource = "=$H$22:$H$25"  
   Case "c"  
       ComboBox.RowSource = "=$H$27:$H$27"  
   End Select  
   '...  
   If TextBox.Value = "" Then .ComboBox.Value = "" Else ComboBox.Value = [z1].Value
 
 
86677{/post}{/quote}  
Теперь понял. Хотя не пойму преимущества данной конструкции.  
То что код более уплатненный?
 
{quote}{login=Hugo}{date=30.08.2010 10:21}{thema=}{post}Например, на 8,5 врёт...{/post}{/quote} на 8,5 другое условие надо.  
Case 5 To 9    ' Number between 5 and 9.  
   Debug.Print "Between 5 and 9"
Я сам - дурнее всякого примера! ...
 
Да это так, ремарка... Могли бы в примере указать, что код рассчитан на целые числа.
 
{quote}{login=segail}{date=30.08.2010 10:39}{thema=Re: }{post}{quote}  
Теперь понял. Хотя не пойму преимущества данной конструкции.  
То что код более уплатненный?{/post}{/quote} Кому как...
Я сам - дурнее всякого примера! ...
 
{quote}{login=segail}{date=30.08.2010 10:39}{thema=Re: }{post}  
... не пойму преимущества данной конструкции...{/post}{/quote}  
ИМХО, при большом числе анализируемух вариантов конструкция Select Case... Case...Case...End Select просто более наглядна и удобочитаема чем If...Else If...If...End If  
Хотя, могут быть, конечно, и какие-то тонкости-различия.  
Сам, например, только недавно узнал, что IIf, оказывается отличается от If и не всегда его заменяет (в IIf проверяется присутствие всех аргументов и если какого-нибудь из них нет, то выдаётся ошибка, а в If аргументы проверяются по очереди в порядке перечисления)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Что-то понял. Спасибо.
 
Сила этого оператора в использовании списка условий, To и Is:  
 
Case 1, 2, 5 To 7, Is >= 10
 
Ага, а еще у этого оператора есть такое применение:  
 
Select Case True  
Case 1=2: Msgbox "Бред"  
Case [N1]="a": ComboBox.RowSource = "=$H$17:$H$20"
Case VarType(Number)=5: Msgbox "Double"  
End Select
KL
 
{quote}{login=The_Prist}{date=30.08.2010 10:43}{thema=Re: Re: }{post}Преимущество в том, что код получается быстрее, т.к. при первом же совпадении условия конструкция завершает свою проверку...{/post}{/quote}  
К сожалению, в VB и VBA применение select case медленнее, чем If-Then-Else.  
Но на С это (было) быстрее.
 
{quote}{login=Alex_ST}{date=30.08.2010 10:52}{thema=Re: Re: }{post}{quote}{login=segail}{date=30.08.2010 10:39}{thema=Re: }{post}{/post}{/quote}  
ИМХО, при большом числе анализируемух вариантов конструкция Select Case... Case...Case...End Select просто более наглядна и удобочитаема чем If...Else If...If...End If{/post}{/quote}  
Алекс, а вот конструкция типа  
If    
...  
ElseIf  
...  
ElseIf  
...  
Else  
End If  
Тоже неплохо читается. :-)
 
Уважаемые ГУРУ и просто любители EXCEL помогите разобраться в макросе чето не идет  
Пример прилагается!)
 
Sub new_()  
Dim g As Variant  
g = ActiveCell.Offset(0, -8)  
 For Row = 1 To 40  
   Select Case IsNumeric(g)  
   Case False  
   ActiveCell.FormulaR1C1 = "=(RC[-8]+RC[-8])"
   Case Else  
   ActiveCell = ""  
   End Select  
   ActiveCell.Offset(1, 0).Select  
 Next Row  
End Sub  
P.S. зачем складывать текст?
 
Tikr, чтоб заработало, можно и так изменить:  
Select Case True  
Но вообще весь код логически не правильный...  
И зачем складывать текст, и зачем 40 раз проделывать уже сделанную работу? Я о проверке...
 
В код листа.  
Sub ttt()  
шапка = Cells(1, 11) 'на всякий случай мумифицируем шапку  
With Columns(3)  
.SpecialCells(xlCellTypeConstants, xlTextValues).Offset(0, 8) = _  
"=(RC[-8]+RC[-8])"
End With  
Cells(1, 11) = шапка  'вернём шапку  
End Sub
 
Спасибо за ответы!!  
Только у меня немного не получается!)  
я не буду складывать текст это я для примера сделал, оригинале бы состаял из другие формулы  
В идеале я бы хотел получить чтобы было два case условия (два разных слова) в диапозоне ячеек и уже согласно этим двум условиям вставлялись бы определенные формулы по ячейкам  
В примере к сожаление получается всего одно условие, и формула одна.))
 
Ваш пример вообще не правильно работает - 40 раз проверяет одну первую ячейку.  
А на Select Case True как раз легко построить такую проверку, как Вам нужно.
 
Sub new_2()  
   Dim g As Variant, r&  
 
   For r = 2 To 21  
       g = Cells(r, 3).Value  
       Select Case True  
       Case IsNumeric(g)  
           Cells(r, 11).FormulaR1C1 = "=(RC[-8]+RC[-8])"
       Case g = "Не определено"  
           Cells(r, 11) = ""  
       End Select  
   Next r  
End Sub
 
В данном случае с If короче и проще, ИМХО:  
 
Sub new_3()  
Dim g As Variant, r&  
 
For r = 2 To 21  
   g = Cells(r, 3).Value  
   If IsNumeric(g) Then  
       Cells(r, 11).FormulaR1C1 = "=RC[-8]+RC[-8]"
   ElseIf g = "Не определено" Then  
       Cells(r, 11) = ""  
   End If  
Next r  
End Sub
 
Спасибо большое друзья за старания  
Пришлось немного поработать над текстом и всё заработало    
Правда надо еще время что доработать до автоматизма  
И я еще понимаю что еще мало что поминаю, ну не че формулы я раньше тоже плохо знал!)
 
Еще вопросик))  
Может ли Case искать различное положение слов букв типа "а*с*", "сми*", "?ли?" а то пробую различные эти комбинации, а они не идут))  
Если да то как правильно эти комбинации надо писать?  
А если нет чем это можно заменить попроще, чтобы код несложный!? :)
 
Sub tt()  
   Dim s  
 
   For Each s In Array("аfggfсfgj", "sfdfdhfh", "смиапрар")  
       Select Case True  
       Case s Like "а*с*": MsgBox s & " = а*с*"  
       Case s Like "сми*": MsgBox s & " = сми*"  
       Case Else: MsgBox s & " = Else"  
       End Select  
   Next  
 
End Sub
Страницы: 1
Наверх