Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2012, 20:05   #1
devf
Пользователь
 
Регистрация: 14.01.2012
Сообщений: 17
По умолчанию Из модуля не исполняется код

Здравствуйте, уважаемые!
Прошу здорово не ругатся, т.к. я только начинаю в VBA.

Суть вопроса:

Имею код, который связывается с Access и вытаскивает таблицу на лист Excell.
Если этот код присвоен кнопке CommandButton на листе - все корректно.
Но если я помещаю код в модуль и пытаюсь вызвать его оттуда, то VBA ругается "Variable not defined" или, когда уберешь Option Explicit - "Object required".
Если не совсем глупый вопрос - прошу помочь.

Код кнопки:

Private Sub CommandButton1_Click()
Call Run("Vyvod")
End Sub


Код в модуле:

Sub Vyvod()
Dim cn As New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;D ata Source=D:\vba_t\Zakaz.mdb"
cn.Open
Dim rs As New ADODB.Recordset
rs.Open "SELECT * FROM Zayav ", cn
Dim QT1 As QueryTable
Set QT1 = QueryTables.Add(rs, Range("A4"))
QT1.Refresh
'Set cn = Nothing
cn.Close
End Sub
devf вне форума Ответить с цитированием
Старый 28.01.2012, 20:50   #2
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Цитата:
Если этот код присвоен кнопке CommandButton на листе - все корректно.
Если я правильно понял задачу, используйте нарисованную кнопку и ей уже присвойте макрос из Вашего модуля. Все должно работать.
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 28.01.2012, 21:10   #3
devf
Пользователь
 
Регистрация: 14.01.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от VictorM Посмотреть сообщение
Если я правильно понял задачу, используйте нарисованную кнопку и ей уже присвойте макрос из Вашего модуля. Все должно работать.
Вот в том то и дело, что если я пишу код на листе напр (Лист1) и рисую там кнопку CommandButton1 по которой выполняется код - все хорошо. Но если тот же самый код записать в модуль и вызвать его с помощью кнопки - то происходит то, что описано выше - или переменная не определена, или требуется объект.
Пробовал просто назначить макрос "Vyvod" кнопке или через код:


Private Sub CommandButton1_Click()
Call Run("Vyvod")
End Sub

Результат тот же - ругается
devf вне форума Ответить с цитированием
Старый 28.01.2012, 22:29   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Так, наверно:
Код:
Set QT1 = ActiveSheet.QueryTables.Add(rs, Range("A4"))
В модуле листа QueryTables по умолчанию относится к Me, т.е. к этому листу, а в обычном модуле QueryTables без явного указания листа трактуется как неопределенная переменная.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619

Последний раз редактировалось Казанский; 28.01.2012 в 22:32.
Казанский вне форума Ответить с цитированием
Старый 28.01.2012, 22:42   #5
devf
Пользователь
 
Регистрация: 14.01.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Так, наверно:
Код:
Set QT1 = ActiveSheet.QueryTables.Add(rs, Range("A4"))
В модуле листа QueryTables по умолчанию относится к Me, т.е. к этому листу, а в обычном модуле QueryTables без явного указания листа трактуется как неопределенная переменная.
Спасибо большое - все заработало. Значит, будем знать, что в таких случаях надо указывать лист.
devf вне форума Ответить с цитированием
Старый 28.01.2012, 22:42   #6
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Цитата:
Call Run("Vyvod")
Интересный наворот
Я понимаю, что написали в попытках заставить это работать, но прикольно. Так еще можно:
Код:
CallByName Application, "run", VbMethod, "Vyvod"
Заработало - замените на
Код:
Vyvod
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 28.01.2012, 23:23   #7
devf
Пользователь
 
Регистрация: 14.01.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Интересный наворот
Я понимаю, что написали в попытках заставить это работать, но прикольно. Так еще можно:
Код:
CallByName Application, "run", VbMethod, "Vyvod"
Заработало - замените на
Код:
Vyvod
Спасибо - и это заработало!
devf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поток исполняется 15 раз grafgrial Общие вопросы Delphi 3 07.06.2011 12:42
Доп.код,обратный код,прямой код вычисления Lukas077 Помощь студентам 0 20.03.2011 12:07
Создание модуля Arassir Общие вопросы Delphi 1 13.03.2011 15:28
LINQ.. исполняется впервые))) Teksa Общие вопросы .NET 0 06.10.2010 10:17
Есть ли возможность выполнить код при инициализации подключаемого модуля? shurik_7866 Общие вопросы C/C++ 0 07.12.2009 22:59