Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA

Модерирует : ShIvADeSt

ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

RUSmafia



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

 
 
Обсуждаем вопросы только по Excel VBA
(программирование макросов, скриптов, пользовательских функций и т.п.).
Приветствуются ссылки на ресурсы и справочную литературу по теме.
 
Вопросы по работе с MS Excel, не относящиеся к программированию, задаем в теме Excel FAQ

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами Excel (об этом можно уточнить здесь) или требующая автоматизации, попробуйте для начала записать макрос самим Excel через меню Сервис (Tools) - Макрос (Macro) - Начать запись (Record New Macro). Подробнее здесь. В большинстве случаев получившийся код (Сервис-Макрос-Макросы-Изменить) Вас не удовлетворит, но подскажет, какие объекты-методы-свойства использовать.  
    Другой Ваш помощник - Просмотр объектов (Object Browser). Ну и встроення помощь (F1), естественно.
     
    Если Вы в тупике, покажите Ваш код (или часть кода) здесь.  Если вылазит ошибка, цитируйте ее полностью. Если код слишком большой, используйте тeг [more].
    Используйте отладчик - Breakpoints (F9), Watches (Shift-F9), Steps (F8 и др.) Сильно облегчает поиск ошибок.

     
    Рекомендуется к прочтению:
  • Первые шаги с Excel VBA
  • Excel VBA: Приёмы программирования
  • WinApi. Лекция из курса "Основы офисного программирования и язык VBA" (для продвинутых)
  • Daily Dose of Excel (eng.) - тематический блог: советы по работе с Excel и прочие материалы
  • Excel Macros & Excel VBA Code Tips, Tricks (eng.) - советы, трюки и уловки
  • Mr. Excel (forum) (eng.) - весьма оживленный форум по Excel&VBA.
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов

  • Всего записей: 556 | Зарегистр. 31-07-2002 | Отправлено: 21:40 14-10-2004 | Исправлено: lucky_Luk, 20:44 13-04-2007
    LevT



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
     
    Как обратиться к ЭтаКнига? - Так и обращайся ЭтаКнига.  

     
    Меня интересует общий случай для произвольного контекста. Сейчас у меня открыто в воркспейсе три книги, соответственно и три проекта в VBE
     
     
     
     
    Добавлено:
     

    Цитата:
     
    Если ты из одного проекта собрался работать с процедурами, классами и т.д. другого, может, имеет смысл все внешнее запихать в dll и вызывать уже оттуда?

     
    Хочу сначала выжать максимум из самого экселя - заодно и в нем самом разобраться чуток. А то можно было бы сразу создать проект в VS.NET Tools для Officе и шаманить, так ни разу экселя вручную не запустив...
     
     
     
    Добавлено:
     
    Ага, проекты можно переименовать. И тогда ясно, куда галку ставить в Tools->References. Уже что-то.
     

    Всего записей: 17686 | Зарегистр. 14-10-2001 | Отправлено: 15:45 13-02-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Господа, при реализации решения задачи копирования данных на другие листы возникла пара вопросов - буду рад, если кто-то поможет мне разобраться...
    1) для того, чтобы скопировались оформление столбцов и строк (в принципе нужна была шапка, скопированная со старого листа на новый - я не нашёл ничего более умного, как скопировать целиком весь лист, а потом удалить диапазон с данными... ;-((
    возможно ли скопировать диапазон (Range) с сохранением форматирования строк и столбцов (высота, ширина...)?
     
    2) для копирования листа использовал конструкцию вида:
    Set w0 = ActiveWorkbook.Worksheets("1Квартал2007")
    w0.Copy After:=w0
    Это отрабатывало, но создавало лист с именем  "1Квартал2007 (2)"
    потом я его переименовывал в нужный:
     ActiveWorkbook.Sheets("1Квартал2007 (2)").Name = "Руководители"
    Можно ли управлять методом Worksheets.Copy чтобы он копировал в лист с нужным именем?
     
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 18:53 13-02-2007
    Troitsky



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    SERGE_BLIZNUK

    Цитата:
    возможно ли скопировать диапазон (Range) с сохранением форматирования строк и столбцов (высота, ширина...)?

    Форматирование ячеек (цвет, границы и пр.) сохранить при копировании можно, а вот высоту/шируну строк/столбцов, по-моему, можно сохранить только при копировании самих строк/столбцов.
     

    Цитата:
    Можно ли управлять методом Worksheets.Copy чтобы он копировал в лист с нужным именем?
    У метода Worksheets.Copy есть только два параметра Before и After.
     
    В описанной ситуации я бы поступил так: держал бы в книге отдельный лист, свойство Visible которого было бы установлено в 0 - xlSheetHidden, который являлся бы незаполненным шаблоном (шапка, сетка и т.д.) для всех остальных листов. Его бы я и копировал куда следует. Чисто визуально он не мешал бы абсолютно.


    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 22:22 13-02-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Спасибо за ответ.
    Цитата:
    можно сохранить только при копировании самих строк/столбцов.
    я это подозревал... А жаль...
    Цитата:
    В описанной ситуации я бы поступил так: держал бы в книге отдельный лист, свойство Visible которого было бы установлено в 0 - xlSheetHidden
    Красивая идея! Спасибо. При случае обязательно воспользуюсь - у меня бродила внутри мысль, чтобы сделать шаблон для шапки - но мысль так и не сформировалась - так что - спасибо!  
    Имхо, вот только лучше сделать Visible = xlVeryHidden - тогда его вручную ввобще нельзя будет не найти, ни включить!
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 00:15 14-02-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LevT

    Цитата:
    Меня интересует общий случай для произвольного контекста

    Насколько произволен контекст?
    Если контекст Excel, то проблема решается выводом всей глобальности в отдельную надстройку (xla, например). Надстройку цепляешь к Excel и обращаешься к ней из любой книги Excel.
    Если контекст MS Office, то надстройка должна уже быть COM и цеплять ее надо везде, где будет нужна (и в Excel, и в Word).
    Если контекст абсолютно любой, то dll.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 07:01 14-02-2007 | Исправлено: The okk, 08:04 14-02-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    Другой вариант пробежатся в цикле по всем строкам-столбцам диапазона и установить их размеры как в исходном листе. Не так уж и сложно.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 08:45 14-02-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    С копированием шаблона получается лучше. Копирование листа целиком в разы превосходит по скорости создание чистого листа с последующим его форматированием (с циклами - тем более). Знаю по опыту, поскольку была задача, отдаленно напоминающая эту. Я там тоже сначала делал новый лист скриптом (там и форматирование листа, и копирование шапки, и задание области печати и все-все-все). Потом решил сравнить по скорости создание нового листа с копированием шаблона. С тех пор использую только шаблоны листов.
     
    Добавлено:
    SERGE_BLIZNUK

    Цитата:
    Имхо, вот только лучше сделать Visible = xlVeryHidden - тогда его вручную ввобще нельзя будет не найти, ни включить!  

    Если Visible = xlVeryHidden, ты метод Copy к нему применить не сможешь.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:52 14-02-2007 | Исправлено: The okk, 08:53 14-02-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk

    Цитата:
    Другой вариант пробежатся в цикле по всем строкам-столбцам диапазона и установить их размеры как в исходном листе. Не так уж и сложно.

    Ну была такая мысль... Не реализовал, ибо скопировать ВЕСЬ лист и потом удалить лишнее для меня в плане написания кода оказалось проще...
    Кстати, если Вам несложно - напишите,  
     
    The okk
    Да. Идея с шаблоном красивая!!!
    Цитата:

    Цитата:
    Имхо, вот только лучше сделать Visible = xlVeryHidden - тогда его вручную ввобще нельзя будет не найти, ни включить!  
    Если Visible = xlVeryHidden, ты метод Copy к нему применить не сможешь.
    Ну, это можно в скрипте переключать, имхо, — приблизительно так:
     .Visible = false  
     .Copy
     .Visible = xlVeryHidden
    я не ошибаюсь?
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 09:54 14-02-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Раньше не обращал внимания на лист "Диалог". Сейчас посмотрел, что это такое. Та же форма, только с убогим количеством возможностей. Кто-нибудь знает, как с ним работать в VBA? Хотя бы как называется коллекция листов с диалогами и где находится их VBA-код?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:37 15-02-2007
    LevT



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
     
    Тоже задавался этим вопросом позавчера, в процессе камлания над объектной моделью. Решил для себя, что это унаследованная фича, от тех еще времен, когда в экселе не было интеграции с VBA. Сейчас уже не помню, где видел. Кстати, а как этот лист вставлять из UI?
     
    В таких визуальных вещах есть своя прелесть: они интуитивным образом решают проблему инициализации и рersistence предпочтений пользователя. Например, мне сейчас нужно всего-то проинициализировать несколько списков при запуске макроса теми фамилиями, которые укажет юзер из общего списка - по умолчанию всеми. Заводить ради этого форму? Нафиг, когда можно просто взять именованный диапазон. Только это некрасиво, потому что непонятно, какой из равноправных листов уродовать лишним объектом (с моей точки зрения) и как-то выделять на общем фоне (с точки зрения пользователя). Потому с удовольствием вставлю диалоговый лист, скажите только как.
     
     
    Добавлено:
     
    Нашел, как на них получить ссылку
     
    Workbook.DialogSheets или Excel.DialogSheet, чтобы увидеть надо включить показ скрытых мемберов в object browser.
     
     
    Добавлено:
     

    Цитата:
     Насколько произволен контекст?
    Если контекст Excel, то проблема решается выводом всей глобальности в отдельную надстройку (xla, например).

     
    А отлаживать код этой xla можно одновременно с отладкой рабочей книги? И как их создавать?
     

    Всего записей: 17686 | Зарегистр. 14-10-2001 | Отправлено: 10:26 15-02-2007 | Исправлено: LevT, 11:37 15-02-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LevT

    Цитата:
    А отлаживать код этой xla можно одновременно с отладкой рабочей книги?  

    А xla это и есть рабочая книга... только переделанная в Add-in. Отлаживается, как рабочая книга. - Суть отладки: открываешь две книги - в одной пишешь макрос, в другой - вызываешь этот макрос из первой книги. Если работает нормально, создаешь надстройку из книги, в которой лежит макрос. Подцепленный Add-in - это все равно, что постоянно открытая книга, которую ты не можешь увидеть.

    Цитата:
    И как их создавать?

    В справке на этот счет вот что написано:

    Код:
    Для получения сведений о том, как сделать программу Visual Basic надстройкой, см. Руководство разработчика Microsoft Office XP, которое можно получить в корпорации Майкрософт.

    Шучу Надо будет просто найти в сети нормальную статью и вбить ссылку на нее в шапку этого раздела. Уокенбах (Walkenbach) в своей книге целый раздел про это написал, тольку у меня под рукой его книги сейчас нет.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 12:24 15-02-2007
    LevT



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Ыгы, спасибо. Есть такая книжка у меня в закромах, дождалась своего часа. excel 2002, новее нет? зато по-русски.
     
    А как все-таки вставлять диалоговые листы?
     
     
    Добавлено:
     
    Забавно. Рассуждаю тут о высоких материях, переключаясь то и дело в TeachPro Excel 2003:  одновременно слушаю тамошнюю дурную тётку, уроки для подстаканников. "...вот так вот мы с вами щелкнем, вот сюда, очень интересная команда..." И с пользой для себя слушаю! Никогда не работал раньше с электронными таблицами.

    Всего записей: 17686 | Зарегистр. 14-10-2001 | Отправлено: 12:40 15-02-2007 | Исправлено: LevT, 13:35 15-02-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LevT

    Цитата:
    Есть такая книжка у меня в закромах

    А у меня только библиотечная.

    Цитата:
    excel 2002, новее нет

    Я имел в виду:
     

    Цитата:
    А как все-таки вставлять диалоговые листы?

    В смысле? Руками? - Как обычный лист: кликаешь правой кнопкой по листам и жмешь добавить. Появляется диалоговое окно с выбором типа листа. Там среди прочего (диаграмма, лист, макрос и т.д.) будет пункт Диалог с соответствующей иконкой. Там уж не ошибешься.
    А если не руками, то видимо, как обычный лист - Коллекция.Add.
    Или ты про вставку полученного диалога в листы с данными, как ActiveX?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 15:55 15-02-2007 | Исправлено: The okk, 15:57 15-02-2007
    LevT



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    книга та самая, в электронном виде, скачал когда-то с megido.ru
     
    а диалоговые листы и впрямь гадость, низачем они такие не нужны. Я-то предполагал ни разу не глядя, что они больше похожи на стандартные листы, чем на юзерформы.
     
    Вот кстати темка для надстройки, кому не влом потренироваться: формоподобный UI на основе стандартных листов экселя. Чтобы можно было одновременно работать пользователю как со стандартным листом (с некоторыми регионами и рюшечками), а программисту как с формой (разного вида регионы имеют разную предопределенную семантику и поведение).  

    Всего записей: 17686 | Зарегистр. 14-10-2001 | Отправлено: 17:10 15-02-2007 | Исправлено: LevT, 18:10 17-02-2007
    serb78

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    подскажите как русифицировать редактор Microsoft Visual Basic в Exel?

    Всего записей: 5 | Зарегистр. 10-02-2007 | Отправлено: 20:52 16-02-2007
    LevT



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    serb78
     
    никак! Если только маньяк-одиночка какой-нибудь склепал и выложил русификацию.
     
    ...На самом деле даже "русифицированные" имена функций на листах - мерзость невообразимая. Подозреваю, что их вернуть к исходному состоянию еще более невозможно. The okk, я прав?
     

    Всего записей: 17686 | Зарегистр. 14-10-2001 | Отправлено: 22:12 16-02-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LevT

    Цитата:
    Подозреваю, что их вернуть к исходному состоянию еще более невозможно

    А я подозреваю, что очень даже несложно...
    Просто поставить английский Office... $-))))

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 17:02 17-02-2007
    LevT



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Юзверей жалко.  А если уж кто полез в функции - то такие продвинутые могут и английские имена освоить.
     
     
     
    Добавлено:
     
    Кста, вопрос о совместимости. Что будет с английскими функциями в русском экселе и наоборот?

    Всего записей: 17686 | Зарегистр. 14-10-2001 | Отправлено: 18:11 17-02-2007
    CEMEH



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите чайнику.
     
    Нужно, что бы в яейке открывался календарик. В макросах не силен. Убил кучу времени и сил, но так и не смог ничего сделать. Помогите.

    Всего записей: 237 | Зарегистр. 17-09-2006 | Отправлено: 00:19 18-02-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LevT
    Цитата:
    вопрос о совместимости. Что будет с английскими функциями в русском экселе и наоборот
    они в Excel хранятся во внутреннем представлении - поэтому в каком Excel откроете - на том языке формулу и увидите...
    В отличии от VBA - тот тоже хранится во внутреннем представлении - но там все функции (отображаются и вводятся) на английском... помоему так...
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 08:11 18-02-2007
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA
    ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru