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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kramrus
    Цитата:
    В EXEL пишем формулу =ИНДЕКС('G:\Люда\[Октябрь 2006.xls]ОШ №11'!РАБОТАЕТ.  
    Пишу макрос  
       Range("AT19").Formula = "ИНДЕКС('G:\Люда\[Октябрь 2006.xls]ОШ №11'!
    НЕ РАБОТАЕТ.  
    Почему????

    Проверил. Сначал сам офигел. А потом разобрался... А ведь правильный ответ вам уже давали: надо заменить русские функции на буржуйские (хоть и русский Excel, и отображаются они по русски, но внутри хранятся на оригинальном языке - а VBA - это считай, что внутри...)
    т.е. в макросе вместо ИНДЕКС напиши INDEX
    а вместо ПОИСКПОЗ напиши MATCH
    всё...
     
    p.s. если интересно, или надо получить формулу в буржуйском - то можешь сделать так - введи формулу руками (в примере в ячейку AT20). а потом напиши макрос вида:
      Range("AT25").Value = "'" & Range("AT20").Formula
    в ячейке AT25 будет формула (при копировании в макрос первый апостроф выкидывай...)

     
    Удачи.  

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 00:38 20-11-2006 | Исправлено: SERGE_BLIZNUK, 00:48 20-11-2006
    Troitsky



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

    Цитата:
    в ячейке хранится адрес страницы в интернете (например http://forum.ru-board.com/topic.cgi?forum=33&topic=3961&start=960)  надо эту страницу из кода сохранить на диск , например в D:\HTM  с именем tekst.htm

    Сохранение файла из Интернета на жесткий диск


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 08:49 20-11-2006
    omikron



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    спасибо!
    все работает,
    еще маленький вопрос, в новой книге можно задавать имя листу?
    Вместо newBook.Sheets(1) написать newBook.Sheets("title") я так понимаю результата не дает.

    Всего записей: 13 | Зарегистр. 06-02-2006 | Отправлено: 09:08 20-11-2006
    Troitsky



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

    Цитата:
    в новой книге можно задавать имя листу?

    Переименование листа:
    Код:
        Sheets("Старое имя").Name = "Новое имя"



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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 09:29 20-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А почему Sheets не Worksheets? в чем разница?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 09:52 20-11-2006
    Troitsky



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

    Цитата:
    А почему Sheets не Worksheets? в чем разница?

    В случае "Sheets" можно иметь ввиду как рабочий лист, так и диаграмму, помещенную на отдельном листе. В случае же "Worksheets", подразумевается только рабочий лист книги (то же самое для диаграмм отдельным листом - "Charts").


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 10:02 20-11-2006 | Исправлено: Troitsky, 10:04 20-11-2006
    OOD

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    подскажите можно ли с помощью VBA  вставить картинку на определенные координаты листа?  

    Всего записей: 3378 | Зарегистр. 20-05-2006 | Отправлено: 10:15 20-11-2006
    Troitsky



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

    Цитата:
    подскажите можно ли с помощью VBA  вставить картинку на определенные координаты листа?  

    Вот так картинка вставляется по координатам верхнего левого угла выделения:
    Код:
    ActiveSheet.Pictures.Insert "D:\73.gif"

    А так, для того чтобы сохранить пропорции, нужно знать высоту и ширину картинки, т.к. все аргументы функции являются обязательными:
    Код:
    ActiveSheet.Shapes.AddPicture "D:\73.gif", True, True, 20, 30, 80, 90

    Способа вставить картинку по координатам, не зная предварительно ширину и высоту картинки, я не знаю. Хотя, в первом случае никто не мешает картинку после вставки передвинуть в нужное место используя
    Код:
      .ShapeRange.IncrementLeft
      .ShapeRange.IncrementTop
    или
    Код:
      .Left
      .Top



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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 11:13 20-11-2006 | Исправлено: Troitsky, 11:17 20-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как получить номер верхней строки диапазона?
    Сорри, нашел уже. Target.Row

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 12:50 20-11-2006 | Исправлено: The okk, 13:31 20-11-2006
    OOD

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

    Цитата:
    OOD
     
    Цитата:
    подскажите можно ли с помощью VBA  вставить картинку на определенные координаты листа?  
     
    Вот так картинка вставляется по координатам верхнего левого угла выделения:
    Код:
    ActiveSheet.Pictures.Insert "D:\73.gif"
     
    А так, для того чтобы сохранить пропорции, нужно знать высоту и ширину картинки, т.к. все аргументы функции являются обязательными:
    Код:
    ActiveSheet.Shapes.AddPicture "D:\73.gif", True, True, 20, 30, 80, 90
     
    Способа вставить картинку по координатам, не зная предварительно ширину и высоту картинки, я не знаю. Хотя, в первом случае никто не мешает картинку после вставки передвинуть в нужное место используя
    Код:
      .ShapeRange.IncrementLeft
      .ShapeRange.IncrementTop
    или
    Код:
      .Left
      .Top

     
    Большое, спасибо вы очень помогли , очень очень, но не могли бы вы ещё помочь можно ли сделать так, чтобы имя "D:\73.gif" т.е. 73.gif бралось из TextBox ?
    т.е. чтобы пользователь ввел в TextBox нужную ему картинку, а она уже вставилась после  выполнения макроса...
     
    вот сделал вот так:
     

    Код:
     
    ActiveSheet.Pictures.Insert TextBox1.Value
    ActiveSheet.Shapes.AddPicture TextBox1.Value, True, True, 97, 7, 85, 114
     

     
    Всё работает, всё добавляеться, но после выполнения
    ActiveSheet.Pictures.Insert TextBox1.Value
    картинка дублируется
     

    Всего записей: 3378 | Зарегистр. 20-05-2006 | Отправлено: 13:57 20-11-2006 | Исправлено: OOD, 14:58 20-11-2006
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите, пожалуйста, советом.
    Этот код ставит Excel в тупик (зависает напрочь):
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("BB23") > 0 Then
    Range("BC23").Formula = "=BA3"
    Else: Range("BC23").Clear
    End If
    End Sub
     
    Или этот:
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("BB23") > 0 Then
    Range("BC23").Value = Range("BA3").Value
    Else: Range("BC23").Clear
    End If
    End Sub
    PS: На листе много (~30) автоматически обновляемых (~ каждую сек.) ссылок.
    Значения в ячейках используемых в процедуре статичные.

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 14:07 20-11-2006 | Исправлено: alin, 16:59 20-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Двоеточие после Else ставить не надо.
    И неплохо бы, наверное, контролировать, какой конкретно диапазон изменился - может, интересующие тебя ячейки не менялись, а ты все равно будешь проверять на больше-меньше - у тебя ж ячейка не одна такая, насколько я понял.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:32 20-11-2006 | Исправлено: The okk, 14:36 20-11-2006
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    alin скорее всего зацикливается, потому как измение ячейки вызвает функцию Worksheet_Change.
    Смотри ответ в шапке Зацикливание в функции Change или SelectionChange (нужно выключить обработку событий- Application.EnableEvents = False , а потом включить.)

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    Не, так не зацикливает. И было бы глупо, если бы зацикливало, поскольку в зависимости от событий нужно в 99% случаев вносить изменения именно в сам лист.
    ....
    А, точно. Зацикливает. Семен Семеныч! Надо ж проверять "изменилось-не изменилось", а тут проверка на больше-меньше. Ясное дело, что зациклит, если BA3 > 0.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:38 20-11-2006 | Исправлено: The okk, 14:49 20-11-2006
    SERGE_BLIZNUK

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

    Цитата:
    И неплохо бы, наверное, контролировать
    The okk прав. Нужно бы ещё и проверять, что поменялось (  проверять параметер ByVal Target As Range )

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 14:39 20-11-2006
    Troitsky



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

    Цитата:
    Всё работает, всё добавляеться, но после выполнения  
    ActiveSheet.Pictures.Insert TextBox1.Value  
    картинка дублируется
    дублирование происходит потому, что это:
    Код:
    ActiveSheet.Pictures.Insert TextBox1.Value  
    ActiveSheet.Shapes.AddPicture TextBox1.Value, True, True, 97, 7, 85, 114
    два разных способа вставки картинки, поэтому при выполнении этих строк кода одна за другой, мы тем самым вставим картинку два раза. или я что не так понял?
     
    По поводу
    Цитата:
    можно ли сделать так, чтобы имя "D:\73.gif" т.е. 73.gif бралось из TextBox ?  
    т.е. чтобы пользователь ввел в TextBox нужную ему картинку, а она уже вставилась после  выполнения макроса...
    и
    Цитата:
    TextBox1.Value
    используй TextBox1.Text вместо имени файла ("D:\73.gif") и все будет нормально (естественно, если текстовое поле будет заполняться правильно).


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 21:00 20-11-2006
    OOD

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    всё спасибо больщущее , вы очень помогли серьёзному делу , а именно помогли 10 000 человекам
    Единственное неудобство ,что Value в TextBox1 нужно писать четким т.е. допустим D:\73.gif, , плохо , что нельзя сделать Маску ввожа 'D:\'+'TextBox1.Value'+'.gif' как в делфи , но ничего и так нормально , ускорили процесс раз в 200  
     

    Всего записей: 3378 | Зарегистр. 20-05-2006 | Отправлено: 22:56 20-11-2006
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    OOD
    ну, мне до уровня господ Yuk и Troitsky ещё расти и расти...
    Однако, отчего же
    Цитата:
    что нельзя сделать Маску ввода  
    ?
    можно. Причём почти точно так, как вы и написали ;-)))  
    ActiveSheet.Shapes.AddPicture "D:\" & Trim(ActiveSheet.TextBox1.Value) & ".gif" ....
    Подробнее...
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 01:14 21-11-2006
    OOD

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    Troitsky
    Спасибо, о Великие джидаи -всё отлино работает , просто замечательно , ура товаристчи

    Всего записей: 3378 | Зарегистр. 20-05-2006 | Отправлено: 09:01 21-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как получить номер (индекс) кодового модуля текущего листа? Хочу в лист обработку события скриптом прописать.
    Отбой тревоги. Нашел. Надо по имени обращаться VBcomponents("Лист" & номер_листа)
    Хорошо, что лист у меня последний (равный количеству листов), а то дейтсвительно надо было бы номер листа как-то получать.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:37 21-11-2006 | Исправлено: The okk, 13:49 21-11-2006
       

    Страницы: 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