Консультация № 160497
15.02.2009, 01:59
0.00 руб.
0 12 2
Пишу небольшую программу на VBA (под Excel). Подскажите, пожалуйста, можно ли "заставить" Excel VBA работать с контролами для .NET. Конкретно мне нужен элемент управления DataGridView. Я пытался добавить его в Toolbox через меню "Additional Controls", но там в списке не оказалось DataGridView. Затем я попытался добавить ссылку на System.Windows.Forms.dll (через Tools --- References), но получилась ошибка: "Can't add a reference to the specified file".
Если использовать DataGridView в VBA Excel никак нельзя, то, может быть, кто нибудь знает альтернативный элемент управления, доступный для VBA Excel? Мне нужен любой элемент управления в виде таблицы, которую можно связать с базой данных (mdb, Access) или не связывать, а заполнить вручную по строкам и столбцам. Кроме того, нужно дать возможность пользователю редактировать данные. Также желательно, чтобы элемент управления мог реагировать на клик мышью по строке (генерировать событие и давать сведения, по какой строке и колонке щелкнули).
Заранее спасибо тем, кто ответит.

Обсуждение

давно
Профессионал
848
1596
17.02.2009, 09:38
общий
посмотрите MSFlexGrid.
Неизвестный
17.02.2009, 15:11
общий
это ответ
Здравствуйте, Гамов Артем Борисович!

К сожалению, не знаю всей специфики вашей программы, но судя по тому, что вы указали в вопросе, хочу предложить вам использовать в excel - как это не парадоксально - лист excel в качестве альтернативного инструмента, потому что:
1) это таблица
2) данные можно вносить руками
3) его можно связать с базой данных ассеss следующим образом. Например, у вас есть база данных db1.mdb и открыта книга excel, в которую выбудете импортировать данные. Если у вас excel 2003 (если нет - пишите, разберемся), выбираем пункт меню Данные->Импорт внешних данных->Импортировать данные... Откроется окно Выбор источника данных. Выбираем Подключение к новому источнику данных и нажимаем Создать. В окне запустившегося Мастера подключения данных выбираем Тип источника ODBC DSN -> Далее -> База данных MS Access. Появится окно, где находим свою базу (нужно знать, где она находится и как называется), жмем ОК. Выбираем таблицы, к которым нужно подключиться. Далее. Вводим название и комментарии. Нажимаем Готово. Появится окно "Импорт данных", где выбираем ячейку, куда (т.е. левее и ниже) будут выводиться данные. И ОК. На этом импорт завершен.
4) Редактировать данные можно, но заливку их в базу вам в любом случае обрабатывать.
5) Лист реагирует на клик мышью по строке. Например, если вставить в активный лист (именно в лист, не в модуль) процедуру следующего содержания

Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox (ActiveCell.Row)
End Sub

то при любом щелчке мышью на этом листе будет высвечиваться окошко, в котором сообщается номер активной строки.

Вот вроде бы все.
Буду очень рад, если смог вам помочь.

PS Нет большей радости для эксперта, чем обратная связь и адекватная оценка ;)
Неизвестный
18.02.2009, 00:30
общий
это ответ
Здравствуйте, Гамов Артем Борисович!
Grid.rar образец применения DataGrid для связи с базой данных (mdb).
Евгений.
Неизвестный
18.02.2009, 16:39
общий
Добрый день. Спасибо всем за ответы.

Botsman, спасибо за подробный ответ. Новым для меня в Вашем ответе был вариант использовать для соединения базы и листа Excel ODBC. Я до сих пор это делал с помощью кода, использовал ADODB и Recordset. Надо попробовать, возможно это будет удобнее, чем мой вариант.
Что же касается использования вместа DataGrid листа Excel, такую возможность я, разумеется, рассматривал, но здесь все упирается в дизайн и отсутствие некоторых возможностей у объекта Worksheet. Например: форму я могу открыть в модальном режиме и пока пользователь не выберет значение, она не закроется. У объекта Worksheet, насколько я знаю, такой возможности нет. Или есть?

Евгений Алексеевич, спасибо за ответ. Но, к сожалению, Ваш файл примера у меня не работает. Возникает ошибка "Could not load some objects because they are not available on this machine". То есть, как я понимаю, нет файла dll или ocx, в котором находится DataGrid. Собственно, именно поэтому я и задавал вопрос . Может быть, Вы можете выложить также и библиотеку с этим контролом? У меня Office 2003.
Неизвестный
18.02.2009, 17:20
общий
Первое, что приходит на ум (обеспечивает псевдомодальнось в рамках книги):

Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
If Sheets(1).Cells(1, 1) <> 2 Then Sheets(1).Activate
End Sub

Вставляем эту процедуру в книгу (именно в книгу, не модуль и не лист) и до тех пор, пока не введете в ячейку a1 на первом листе цифру 2, на другие листы перейти не сможете

Если это не устраивает - пишите, подумаю исчо
Неизвестный
18.02.2009, 22:24
общий
Здравствуйте Артем Борисович.
в моей конструкции использованы контролы Microsoft. Adodc и DataGrid, достатачно "взрослые" библиотеки MSADODC.OCX и MSDATGRD.OCX соответственно, от 24 июня 1998 г.
Library.rar
Евгений.
Неизвестный
19.02.2009, 02:19
общий
Здравствуйте.

Евгений Алексеевич, у меня вышло следующее. Я скачал контролы, выставил на них ссылки в References. После этого одна ошибка пропала (та, которая была связана с объектом Adodc). НО: контрол DataGrid на форме не появился. Я попытался добавить его вручную. Открыл Toolbox, выбрал контекстное меню Additional Controls, но в списке доступных контролов DataGrid не появился (обычно, когда я добавлял ссылку в References, в Toolboxe появлялся новый контрол и я мог его использовать). Может быть, он вообще недоступен для моей версии Office и VBA? Тогда, наверное, придется изучать MSFlexGrid, как об этом писал PsySex.

Botsman, скорее всего, я был не прав, и Worksheet может полностью заменить форму, если постараться. Видимо, это просто дело вкуса. У меня, наверное, сложилась привычка после программирования под Access и 1С, что добавление новых данных и редактирование происходит на форме, а лист используется лишь для отображения получившихся данных (как отчет в Access и 1С и печатная форма в 1C). В общем, попробую еще разобраться с разными версиями Grid'ов, ну, а если не получится, тогда придется менять привычки .
Если Вы знаете 1С, то я могу точно объяснить, что именно мне нужно: я хотел бы делать нечто вроде того, что в 1С называется "форма списка".
Неизвестный
19.02.2009, 09:25
общий
Увы, до 1С я пока не добралсяНо могу дать еще пару советов как сделать лист более бохожим на форму.
По умолчанию его можно сделать скрытым, отобразить для того чтобы пользователь сделал все что нужно и по нажатию на кнопу типа ОК (ее тоже можно вставить в лист) опять скрыть.
На самом листе можно закрепить области так, чтобы ничего правее диапазона вывода данных не отображалось:
Range("L2").Select 'Оставим верхнюю строку для "заголовка" "формы"
ActiveWindow.FreezePanes = True
А если еще убрать заголовки строк и столбцов, мало что будет напоминать пользователю, что это excel лист:
ActiveWindow.DisplayHeadings = False
Кстати, ярлычки листов можно тоже не показывать:
ActiveWindow.DisplayWorkbookTabs = False
Покрасьте первую строку синим, все лишнее вокруг - серым, обведите границу диапазона ввода данных жирной линией и ПОПРОБУЙТЕ ТОЛЬКО СКАЗАТЬ, ЧТО ЭТО ОБЫЧНЫЙ ЛИСТ!!!
Неизвестный
19.02.2009, 21:42
общий
Здравствуйте Артем Борисович.
Библиотека MSDATGRD.OCX включенна в состав Microsoft Office XP Developer и VB6.0
очевидно я не собрал все необходимые компоненты, попробуем еще раз - MSDATGRD.rar
Евгений.
Неизвестный
20.02.2009, 01:58
общий
Здравствуйте, Евгений Алексеевич и Botsman! Большое спасибо за помощь и участие. В первый раз на этом ресурсе и даже не ожидал такой активности.

Евгений Алексеевич, почему-то по-прежнему никак не получается. Я распаковал и выложил файлы туда же, где и остальные контролы, проверил, ссылка в References выставлена. Но все то же самое, при открытии файла Grid.xls ругается так же, как и раньше, на форме контрол DataGrid не отображается, при попытке добавить его самостоятельно он не отыскивается в списке Additional Controls в Toolbox'е. Прошел по Вашей ссылке, там столько интересных контролов, но, увы, как мне их подключить? Может быть, для работы с ними нужен Office именно Developer Edition? Так написано в статье по Вашей ссылке. У меня просто Office 2003. Знаете ли Вы какие-нибудь способы, как заставить Excel с этим работать? Может быть, нужна какая-то общая библиотека, которая заставляет Excel работать с этим и другими контролами?

Botsman, то, что Вы предложили очень интересно, но требует, как мне кажется, написания дополнительного кода в гораздо большем объеме, чем это потребовалось бы при использовании обычной формы. Хотя это было бы очень красивое и необычное решение. В общем, если не удастся, "добить" DataGrid и не понравится MSFlexGrid, тогда уже буду использовать Ваш вариант. Теперь, кстати, это для меня еще больше актуально, т.к. если бы вариант с DataGrid'ом удался бы, то можно было бы использовать и другие контролы, указанные в ссылке Евгения Алексеевича.
Неизвестный
20.02.2009, 02:11
общий
Здорово! Все получилось!

Оказывается, нужно еще регистрировать OCX'ы с помощью regsvr32.exe. Теперь все отлично работает.

Евгений Алексеевич, а можно еще вопрос: нет ли у Вас ссылки, по которой можно скачать остальные контролы из этого же пакета?
Неизвестный
20.02.2009, 22:44
общий
Здравствуйте Артем Борисович.
1. "...нужно еще регистрировать..." подразумевалось, система должна знать где находятся инструменты.
Путь размещения по умолчанию %SystemRoot%\system32\ (C:\WINDOWS\system32\...), простые библиотеки, в большинстве случаев, достаточно скопировать в эту папку и они начнут "работать", т.к. при обращении к файлу без указания пути осуществляется поиск вызываемого файла в папках указанных в системной переменной Path.
После регистрация сокращается время доступа к библиотеке, для современных компьютеров это не критично, а корректное обращение ко всем файлам поддерживающим библиотеку - это важно.
2. "...можно скачать остальные контролы..." попытайтесь здесь: Free Ocx File Directory
Евгений.
Форма ответа