Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Basic / VBA


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Basic/VBA

Выпуск № 588
от 07.08.2007, 20:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 293, Экспертов: 46
В номере:Вопросов: 4, Ответов: 10


Вопрос № 97080: Здравствуйте, уважаемые эксперты! Помогите пожалуйста в следующем вопросе. Есть внешняя база данных. (.mdb) СУБД организована через Эксель 2003. :) Мне показалось удобным, что у всех пользователей есть Эксель и код можно обтачивать оп...
Вопрос № 97092: Пожалуйста, подскажите, как узнать количество заполненных строк и столбцов на листе Excel (некоторые строки или столбцы могут быть пустыми)? При нажатии Ctrl+End это сразу видно, а как это вычислить программно?...
Вопрос № 97102: Имеется таблица в EXEL: в строчках стоит наименование товара, дата поступления и его количество. как сделать , чтобы в отдельных ячейках считалось общее количество по каждому виду товара (ассортимент - 30 фиксированных наименований) и возможно ли это...
Вопрос № 97109: УВ! эксперты! Здравствуйте! Есть база в ACCESSE(основная) и база на рабочем месте пользователя (НЕ СЕТЕВАЯ!). Пользователей 15. Ежемесячно пользователи приносят отчет(у меня это просто макрос Запрос-"запрс на выборку информации за исте...

Вопрос № 97.080
Здравствуйте, уважаемые эксперты!
Помогите пожалуйста в следующем вопросе.
Есть внешняя база данных. (.mdb)
СУБД организована через Эксель 2003. :)
Мне показалось удобным, что у всех пользователей есть Эксель и код можно обтачивать оперативно под каждого пользователя.
Требуется сделать выборку из таблицы БД и загнать в... а вот теперь вопрос:
MS FlexGrid не получается использовать ("... not properly licensed")
Тоже самое с DataGrid.
ListBox неудобен, т.к. невозможно визуально разделить колонки и соответственно озаглавить.
В лист Экселя вставлять неудобно, т.к. не фокусирует внимание пользователя и получается каша и ежедневные "подойди-покажи".
Устанавливать каждому Аксес - не вариант.
Посоветуйте, как бы так исхитриться, чтоб красиво и удобно. И в Экселе. :)
С уважением, Александр.
Отправлен: 02.08.2007, 11:33
Вопрос задал: Alexander N. Monastyrsky (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Alec Perle
Здравствуйте, Alexander N. Monastyrsky!
Я для таких целей (БД+Excel без Access) использую элемент управления ListView.
Для этого нужно подключить Microsoft Windows Common Controls 6.0.
Чтобы отделить колонки, необходимо свойство элемента View изменить на 2 (константа lvwList).
---------
Пессимист - это хорошо информированный оптимист (а оптимист - хорошо проинструктированный пессимист)
Ответ отправил: Alec Perle (статус: Студент)
Ответ отправлен: 02.08.2007, 19:31
Оценка за ответ: 5
Комментарий оценки:
Нормальный вариант, только я не очень разобрался сразу, каким образом с ним работать, чтоб была таблица. Мне бы еще и литературу :) , чтоб не блуждать методом научного тыка. Ну на то и Микрософт... Спасибо, я как то не сообразил, что можно с этим объектом работать


Вопрос № 97.092
Пожалуйста, подскажите, как узнать количество заполненных строк и столбцов на листе Excel (некоторые строки или столбцы могут быть пустыми)? При нажатии Ctrl+End это сразу видно, а как это вычислить программно?
Отправлен: 02.08.2007, 13:08
Вопрос задал: Mart Land (статус: 1-ый класс)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Alexander N. Monastyrsky
Здравствуйте, Mart Land!
Для этого можно воспользоваться свойством CurrentRegion.
Object.CurrentRegion, где Object - это объект Range.
Данное свойство возвращает текущую область диапазона Object.
Текущая область определяется каак область, окружающая текущую ячейку или диапазон ячеек, ограниченный пустыми строками сверху-снизу и пустыми столбцами слева-справа.
"Программирование на VBA 2002" Кузьменко В.Г.
А попроще - в примере.

Приложение:

---------
Страшен Русский сервис, бессмысленный и беспощадный...

Ответ отправил: Alexander N. Monastyrsky (статус: 1-ый класс)
Ответ отправлен: 02.08.2007, 13:34
Оценка за ответ: 1
Комментарий оценки:
К сожалению, a и b возвращают разные значения в зависимости от позиции курсора на листе. Например, в позиции (1,1): a=5 b=1, в позиции (2,2): a=4 b=2, в позиции (3,3): a=1 b=1.

Отвечает: Genyaa
Здравствуйте, Mart Land!

Если нужен аналог Ctrl+End, то используйте UsedRange - прямоугольная область, объединяющая все использованные ячееки на листе, например:

ActiveSheet.UsedRange.Rows.Count - количество использованных строк.
---------
Всякое решение плодит новые проблемы.
Ответ отправил: Genyaa (статус: Студент)
Ответ отправлен: 02.08.2007, 14:37
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо! Это то, что нужно, самый точный ответ на вопрос, оптимальный вариант.

Отвечает: Ualife
Здравствуйте, Mart Land!
Попробуйте организовать цикл - пример в приложении.
Макрос читает все ячейки из колонки A и добавляет к переменной n еденицу в случая если ячейка не пуста.

Приложение:

---------
Нет границ - есть лишь препятствия!

Ответ отправил: Ualife (статус: 3-ий класс)
Ответ отправлен: 02.08.2007, 15:49
Оценка за ответ: 1
Комментарий оценки:
Для Rows.Count=65536 i и n вероятно должны быть Long, а не Integer, чтобы не возникало ошибок. Но самое главное в подсчете не участвуют пустые строки между заполненными (см. вопрос), а их тоже надо учитывать. Спасибо за попытку помочь.

Отвечает: Черников Игорь Владимирович
Здравствуйте, Mart Land!
Вот Ваш код:
Set ran = ActiveSheet.UsedRange
'Посчитываем количество строк i и количество столбцов j в которых содержатся данные на листе
For i = 1 To ActiveSheet.UsedRange.Rows.Count
For j = 1 To ActiveSheet.UsedRange.Columns.Count
Next j
Next i
ActiveSheet.UsedRange.Select 'И, если нужно, выделяем их
Selection.Copy 'А потом, если надо, копируем выделенное
Удачи!
---------
От каждого по способностям, каждому по труду
Ответ отправил: Черников Игорь Владимирович (статус: 3-ий класс)
Ответ отправлен: 02.08.2007, 17:45

Отвечает: Alec Perle
Здравствуйте, Mart Land!
Можно также воспользоваться записью макросов.
Возьмите непустой лист, установите курсор на ячейку A1 и выберите меню [Сервис] - [Макрос] - [Начать Запись...].
Начнется запись действий пользователя в виде макроса.
Нажмите Ctrl-End, затем нажмите кнопку окончания записи макроса (в ввиде квадратика).
После этого в редакторе VBA посмотрите, что записалось. В частности у меня получилось:
Sub Макрос1()
'
' Макрос1 Макрос
' Макрос записан 02.08.2007 (Alec Perle)
'

'
ActiveCell.SpecialCells(xlLastCell).Select
End Sub
то есть

ActiveCell.SpecialCells(xlLastCell)

указывает как раз на необходимую Вам ячейку на активном листе.
PS. Таким способом можно узнать большое количество процедур, свойств и методов объектов Excel, особенно, как в Вашем случае, если есть необходимость реализовать в виде программы некоторые действия пользователя.

---------
Пессимист - это хорошо информированный оптимист (а оптимист - хорошо проинструктированный пессимист)
Ответ отправил: Alec Perle (статус: Студент)
Ответ отправлен: 02.08.2007, 19:41


Вопрос № 97.102
Имеется таблица в EXEL: в строчках стоит наименование товара, дата поступления и его количество. как сделать , чтобы в отдельных ячейках считалось общее количество по каждому виду товара (ассортимент - 30 фиксированных наименований) и возможно ли это сделать простой функцией или придется изучать VBA?
Отправлен: 02.08.2007, 14:08
Вопрос задал: Шойтов-Харитановский В.Ю. (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Genyaa
Здравствуйте, Шойтов-Харитановский В.Ю.!

См. функцию СУММЕСЛИ

или используйте сводные таблицы (Меню-Данные-Сводная таблица)
---------
Всякое решение плодит новые проблемы.
Ответ отправил: Genyaa (статус: Студент)
Ответ отправлен: 02.08.2007, 14:33
Оценка за ответ: 5
Комментарий оценки:
Очень важно подсказать в каком направлении вести поиск. Ответ полностью меня удовлетворил!

Отвечает: Alexander N. Monastyrsky
Здравствуйте, Шойтов-Харитановский В.Ю.!
В принципе вероятно, если я правильно разобрался в вопросе.
В случае, если таблица не изменяется, то:
или ссуммировать нужные ячейки ( = В1 + В4 + В7)
или отсортировать и подбить сумму по каждой группе.
В ином случае, если потребуется делать выборку - без VBA не обойтись.
Я нацарапал маленькую функцию. Требуется создать в макросах модуль и вставить в него ее.
Потом, когда в EXСEL вставляете функцию в ячейку, в списке категорий выберите "определенные пользователем" и собственно эту функцию.
В функции 2 поля:
1. Наименование продукции
2. Область в которой производить поиск.
Ну и соответственно измените поля выбора колонок.

Приложение:

---------
Страшен Русский сервис, бессмысленный и беспощадный...

Ответ отправил: Alexander N. Monastyrsky (статус: 1-ый класс)
Ответ отправлен: 02.08.2007, 15:21
Оценка за ответ: 4
Комментарий оценки:
Мне уже подсказали более простое решение сиспользованием стандартной функции СУММЕСЛИ.

Отвечает: Черников Игорь Владимирович
Здравствуйте, Шойтов-Харитановский В.Ю.!
Можно и без VBA! Сделай так:

Удачи! Если нужен будет макрос - пиши, сделаю!

Приложение:

---------
От каждого по способностям, каждому по труду

Ответ отправил: Черников Игорь Владимирович (статус: 3-ий класс)
Ответ отправлен: 02.08.2007, 19:01


Вопрос № 97.109
УВ! эксперты! Здравствуйте!
Есть база в ACCESSE(основная) и база на рабочем месте пользователя (НЕ СЕТЕВАЯ!). Пользователей 15. Ежемесячно пользователи приносят отчет(у меня это просто макрос
Запрос-"запрс на выборку информации за истекший месяц")-формат EXCEL - выходной файл на диск "а".
Поьзователь на основной базе их принимает примерно по этому же принципу.
Оно работает. Но ТАК!!! коряво... То формат EXCELя не совпадает, то пользователи на локальных рабочих местах недосохронят (в смысле - при выполнении мароса надо пересохронить EXCELевский файлик на дискетку)И самое плохое - запрос слишком жесткий.
WHERE ((otchet.datat Between Date() And DateAdd("m",-1,Date())));
Если кто-то один месяц завел позже, а другой, наоборот - надо раньше - в отчете выходит первая запись, заведенная в этом месяце. СИЖУ потом ПРАВЛЮ...
ВОПРОС: Как правильно и корректно организовать обмен данными между пользователями. Прошу учесть. Основная база - ACCESS97, а в подразделениях -2.0!
Спасибо большое, заранее!
Отправлен: 02.08.2007, 15:32
Вопрос задала: Maychik (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Alec Perle
Здравствуйте, Maychik!
А почему-бы не организовать обмен не с помощью файлов EXCEL, а с помощью текстовых файлов, задав жестко свой формат.
Например:
наименование подразделения==отчетный месяц==признак начала строки==номер столбца==значение==....==признак конца строки и т.д.
Макросы в программах клиентов создают этот файл, а на стороне с основной базой - считывают и заполняют необходимые поля базы.
При этом, кстати, сильно уменьшится размер отчетных файлов - не надо сохранять форматирование ячеек EXCEL.
Чтобы избавиться от проблем с месяцами, можно добавить поле, указывающее, что запись была добавлена в отчет в таком-то месяце. Тогда запрос упростится - выбрать те записи, которые еще не попадали в отчет.
---------
Пессимист - это хорошо информированный оптимист (а оптимист - хорошо проинструктированный пессимист)
Ответ отправил: Alec Perle (статус: Студент)
Ответ отправлен: 05.08.2007, 16:26


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.54 beta от 01.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное