Страницы: 1
RSS
Применение функции AND в VBA
 
Добрый день. Помогите понять, почему может не работать следующий макрос? Какие параметры функции AND или как написать по другому? Спасибо.  
Код
If ComboBox1 = "Pre-payment" Then
         Cells(6, 2) = "  V  " And Cells(6, 11) = Empty
      Else
        Cells(6, 11) = "  V  " And Cells(6, 2) = Empty
      End If
Изменено: AlexBosenko - 11.08.2017 09:58:07
 
Не знаю, как модеры отнесутся к названию темы. И мой Вам совет, описывайте свою задачу(с примером, как положено), а не Ваше видение ее решения.
Еще Вам бы Правила почитать.
Зачем темам давать осмысленное название?
предложите новое название темы. Модераторы исправят.  Пока тему не закрыли. А по теме предположительно And вообще ни к чему.
Код
If ComboBox1 = "Pre-payment" Then
 Cells(6, 2) = " V " 
Cells(6, 11) = Empty
 Else
 Cells(6, 11) = " V " 
Cells(6, 2) = Empty
end if

или так:
Код
Cells(6, 2) =iIf( ComboBox1 = "Pre-payment" , " V ", Empty)
 Cells(6, 11) = iIf( ComboBox1 = "Pre-payment",  Empty , " V ")
Изменено: kuklp - 12.08.2017 10:32:08
Я сам - дурнее всякого примера! ...
 
Функция "And" в VBA (как, кстати, и в других языках программирования) применяется, когда требуется проверка одновременного выполнения двух или более условий. Она НЕ применяется для записи в одну строку нескольких команд. Команды в VBA записываются либо одна под другой, либо в одну строку через двоеточие.
Код
If (ComboBox1 = "Pre-payment") And (ComboBox2 = "Pre-payment")  Then
    Cells(6, 2) = "  V  "
    Cells(6, 11) = Empty
Else
    Cells(6, 11) = "  V  " : Cells(6, 2) = Empty
End If

Т.е. если Вы хотите перевести с человеческого языка на язык VBA такую конструкцию "если выполняется условие1, то выполнить действие1 и выполнить действие2", то несмотря на то, что в человеческом языке команды "выполнить действие1", "выполнить действие2" соединяются с помощью "и", на языке VBA в этом случае "and" не используется, эти две команды на выполнение действий либо записываются в двух разных строчках одна под другой, либо в одну строчку с двоеточием между ними. А если мы переводим с человеческого языка на язык VBA конструкцию "если одновременно выполняются условие1 и условие2, то выполнить действие1", то на языке VBA условие1 и условие2 записываются в одну строчку и между ними ставится "And".      
Изменено: Equio - 12.08.2017 09:58:58
 
Цитата
Equio написал: Функция "And" в VBA ... НЕ применяется для записи в одну строку нескольких команд.
Иногда все же применяется для побитовых (бинарных) операций: 2 Or 4,  5 And 3 , даже Not 2 , подробнее здесь. Но по данной теме все правильно написано :)
Изменено: ZVI - 12.08.2017 11:36:06
 
Использование and мне в данном случае напоминает &/&& в shell скриптах. Такое ощущение, что ТС захотел получить такой же эффект как описано вот в этой статье (на английском правда) https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true

В привычном (для shell-скриптинга) понимании этого способа использование and в vba в указанном виде я не вижу. Если хочется все уместить в одну строку, обычно выражения отделяют двоеточием. Где-то читал, что это может несущественно сократить время работы макроса.
С уважением,
Федор/Все_просто
 
Если бы продавцом был VBA, то он мог бы коварно спросить у покупателя: "Сколько взвесить арбузов и дынь?" и на ответ "5 и 3" взвесил бы 1 не знаю даже чего :)
MsgBox 3 And 5 выдаст 1
Изменено: ZVI - 12.08.2017 13:16:20
 
ZVI, спасибо за интересное дополнение. Вам приходилось это использовать в решении какой-нибудь практической задачи?
 
:)
5 And 5 = 5
5 And 0 = 0
17 Or 2 =19
 
Цитата
AlexBosenko написал:
как написать по другому?
Код
    ReDim a(1): a(1) = "V":
    Cells(6, 2) = a(-(ComboBox1 = "Pre-payment"))
    Cells(6, 11) = a((ComboBox1 = "Pre-payment") + 1)
Я сам - дурнее всякого примера! ...
 
Цитата
Все_просто написал:
Где-то читал, что это может несущественно сократить время работы макроса.
Ради интереса потестировал. В простейшем случае скорость одинаковая. Такой код
Код
a = Now
For i = 1 To 100000000
      S1 = S1 + i: S2 = S2 - S1 * 2
Next i
MsgBox (Now - a) * S2 / S1
даёт такое же время расчёта, как и без двоеточия в две строки.  
 
Цитата
Equio написал: Вам приходилось это использовать в решении какой-нибудь практической задачи?
Код
' True когда (любая) размерность массива задана
Function IsArrayDim(Arr()) As Boolean
  IsArrayDim = Not Not Arr
End Function

Sub Test()
  
  Dim Arr()
  Debug.Print "массив не пустой = " & IsArrayDim(Arr)
  
  ReDim Arr(0 To 1)
  Debug.Print "массив не пустой = " & IsArrayDim(Arr)

End Sub
 
ZVI, спасибо. Есть ли какие-то преимущества перед просто проверкой на Not(arr) = -1?
Изменено: Equio - 12.08.2017 16:55:07
Страницы: 1
Читают тему
Наверх