Страницы: 1
RSS
Ошибка "argument not optional"
 
Доброй ночи всем!

В модуле листа условие, если ячейка O7=BACK, то запустить макрос
Код
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address <> "$O$7" Then Exit Sub
   If Target = Back Then Call Back
End Sub

В стандартном модуле должен после этого запуститься макрос Back.
Увы выдается ошибка "argument not optional". Никак её побороть не могу, подскажите куда копнуть!?

Инфу брал из:
Скрытый текст


Во вложении скрин ошибки и сама книга. Внимательно (!) она без программы, из которой по DDE получает инфу будет выдавать ошибки.
Цитата из файла помощи к программе:
Скрытый текст
Изменено: Maxim39 - 17.09.2015 11:20:12
 
Maxim39, здравия. Во-первых, код следует оформлять соответствующим тэгом. (кнопка на панели инструментов области текста сообщения <...>)
Во-вторых, Вы вызываете процедуру Back без параметров, а она подразумевает передачу ей обязательных параметров, судя по скрину.
Изменено: JayBhagavan - 17.09.2015 02:15:57

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Доброй ночи, JayBhagavan!
Спасибо что не спите (=
И за быстрый ответ, сейчас буду пробовать.

Ссори, в VBA слаб... не понял про теги. Такой код тоже вызывает ошибку:

Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$O$7" Then
     If IsEmpty(Target) Then Exit Sub
        IF Range("O7") = Back THEN
   CALL Back
     End If
End Sub 
'Инфа отсюда http://www.programmersforum.ru/showthread.php?t=60413 (второе сообщение)
Изменено: Maxim39 - 17.09.2015 13:39:11
 
Процедура Back принимает четыре аргумента указанные в скобках после названия (channel as string, selection as string ....).
Ошибка означает, что Вы пытаетесь запустить Back без передачи аргументов, что неприемлемо.
Решение: 1. Запуск CALL Back в такой форме CALL Back ("Пример1", "Пример2", "Цена вопроса", "Еще чтото").
Таким образом запуск процедуры  Back будет выполнен успешно т.к. она получила все объявленные аргументы.
2. Второй вариант сделать аргументы опциональными и присвоить им значения по умолчанию.

Что касается тегов VBA не причем. В момент когда создаете сообщение на форуме и хотите вставить код, часть кода нужно нажать Кнопка форматирования кода <...> после чего вставить код в форму с серым фоном.
Изменено: TSN - 17.09.2015 08:45:38
 
Цитата
Maxim39 написал: Ссори, в VBA слаб... не понял про теги
VBA тут ни причём )) Ищите такую кнопку (см. скрин) для оформления кода.
 
Предположу, что Back - это просто текст в ячейке и задача сравнить значение ячейки и если значение в ячейке Back, то вызвать эту процедуру
Код
IF Target = "Back" THEN Call Back
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
TSN, Юрий М - с тегом поправил, спасибо!

The_Prist - да, верно Back - это просто текст. Увы тоже выдает ошибку, Excel сам выделяет Target, может в этом подсказка!?
Цитата
TSN написал:
Решение: 1. Запуск CALL Back в такой форме CALL Back ("Пример1", "Пример2", "Цена вопроса", "Еще чтото").
Когда условие срабатывает (в ячейке O7 слово BACK), она вызывает Back там так и прописано, вписал как Вы написали, тоже ошибка.
 
Target.Value = "BACK"
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Поменяйте или контрольное слово или имя вызываемого макроса, чтобы не было путаницы )
 
Цитата
The_Prist написал: Target.Value = "BACK"
Спасибо, что помогаете!
Код
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address = "$O$7" Then Exit Sub
   If Target.Value = "B" Then Call Back 'теперь выделяется call Back
End Sub

Цитата
Юрий М написал: Поменяйте контрольное слово
Можно поменять кодовое слово на на анг B, ошибка не из-за этого...  
Изменено: Maxim39 - 17.09.2015 15:11:58
 
Цитата
Maxim39 написал: ошибка не из-за этого...
Я не про ошибку - про путаницу ))
 
Уже говорилось, что Sub Back требует параметров.
К тому же Module1 (судя по скринам) содержит кучу ошибок.
 
Цитата
Sclif666 написал: Уже говорилось, что Sub Back требует параметров.
Что значит требует параметров? Можно самый простой пример  
 
Короче приложите свой файл и проблемы уйдут. Вы чего-то там наляпали, не знаете сами чего. Видимо ни процедур, ни других нужных вещей в проекте нет. Вот ошибки и лезут одна за другой.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Файл приложил сразу в первом посте, только внимательно, перед этим другие рабочие книги закрыть и заодно отключить макросы, т.к. книга будет ссылаться на программу которая у Вас не запущена и будет выдавать ошибки!
 
Тогда не буду скачивать. Зачем ковырять проект, который заведомо содержит неисправляемые ошибки.

Если Ваша процедура BACK записана вроде:
Код
Function BACK(ByVal sArg as string)
'непосредственно код процедуры
End Function

значит она с аргументами. Т.е. если внутри скобок что-то написано и там есть хоть один As без Optional(Optional sArg as string) - значит надо в эту функцию/процедуру передать этот sArg:
Код
call Back(Target.Value)


Совет такой: потратьте пару часиков на чтение о передаче аргументов в функцию. Да и вообще об азах VBA.
Форумы никак не для обучения Вас всех самых начальных азов - это Вы должны почерпнуть из литературы и прочих материалов, коих в сети толпы.
Я привел лишь маленький пример и если не поймете - я уж извините, из темы устранюсь. Хотя может кому-то сейчас захочется посвятить Вас во все азы программирования в VBA, чтобы Вы поняли что такое аргумент в функции/процедуру и когда его надо обязательно передавать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
Sub Back(channel As String, selection As String, price As String, amount As String)
    Back "HILO_STANDARD", "Card 1 or further", "back_price", 5 'БЕСКОНЕЧНАЯ РЕКУРСИЯ?
'''''End Sub - У ПРОЦЕДУРЫ М.Б. ТОЛЬКО ОДИН END SUB

Dim feed As Integer, counter As Integer
Dim data As String
counter = 0
feed = 0
While counter < 5 And feed = 0
  feed = Application.DDEInitiate("xfeeder", "betting")
Wend
If feed > 0 Then

  data = "back|" & channel & "|" & selection & "|" & price & "|" & amount

  
  Dim cw As Worksheet, ldws As Worksheet
  Set cw = ThisWorkbook.ActiveSheet
  Set ldws = ThisWorkbook.Worksheets("Loading")
  If cw.name = ldws.name Then
    Set cw = ThisWorkbook.Worksheets(1)
    cw.Activate
  End If
  ldws.Activate
  Range("AA1000") = data
  Application.DDEPoke feed, "bet", Range("AA1000")
  cw.Activate
End If
End Sub

'ПРИМЕР ВЫЗОВА
SUB EXAMPLE
  CALL BACK("channel", "selection", "price", "amount")
END SUB
 
The_Prist, спасибо Вам за помощь и потраченное время, заходил на Ваш сайт, понимаю что занимаетесь сложными проектами и обучение начинающих не в приоритете. Книги скачал, но многое не понятно... буду дальше изучать.

Sclif666, спасибо за хороший пример, что-то я ступил с несколькими End Sub, буду дальше пробовать.

Спасибо всем за подсказки, постараюсь разобраться! Если проблему решу - отпишусь здесь.  
Изменено: Maxim39 - 17.09.2015 15:47:27
 
Sclif666, огромное СПАСИБО,только сейчас понял свою ошибку, сделал как Вы написали и всё заработало как надо! (см.скриншот)
Вы хорошие люди, что не ленитесь и помогаете таким новичкам как я!  :)
Страницы: 1
Читают тему
Наверх