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

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

    Цитата:
     вобще где нибудь, можно найти доку по макросам и VBA на русском языке

    Литературы в инете ПОЛНО!! в том числе и на русском. и книжек полно.
    поищи, например, на Natahaus - Лучшие книги Интернета
    там был Уокенбах, Джон Подробное руководство по созданию формул в Excel 2002.  
    (правда, 34 Мб!) ссылки на скачку
    там же - Каталог ссылок на книжки по теме MS Excel
    и ещё на рубоарде есть топик Учебники по MS Office 2003 на русском.. разные! много!

    Всего записей: 2005 | Зарегистр. 12-09-2002 | Отправлено: 17:58 23-11-2006 | Исправлено: SERGE_BLIZNUK, 18:01 23-11-2006
    Yuk



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

    Цитата:
    что же входит в UsedRange кроме заполненных ячеек?

    Все от Ctrl-Home до Ctrl-End.
     
    Добавлено:
    Можешь проверить макросом:
    Debug.Print Activesheet.UsedRange.Address
     
     
    Добавлено:

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

    А коменты чем не устраивают?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 20:21 23-11-2006
    The okk



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

    Цитата:
    Все от Ctrl-Home до Ctrl-End.  

    Объясняю ситуацию - заполнено 10 строк. UsedRange.Rows.Count = 80. Не могу понять, почему. Ведь остальные строки чистые.
     

    Цитата:
    А коменты чем не устраивают?

    меня просто удивило отсуствие очевидной опции в Excel. - Выдавать всплывающую подску для ячеек. Ведь может быть и такое, что содержимое ячейки не помещается на экране полностью. В этом случае помогает всплывающая подсказка, к которой мы все так привыкли. А коменты/заметки/примечания - это ОЧЕНЬ слабая и малопривлекательная замена.

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

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

    Цитата:
    Объясняю ситуацию - заполнено 10 строк. UsedRange.Rows.Count = 80. Не могу понять, почему. Ведь остальные строки чистые.  

     
    Есть метод (ActiveCell.SpecialCells(xlLastCell).Select), устанавливающий при открытии книги последнюю ячейку и если пользователь в течение сеанса просто пробежал по пустым ячейкам вниз, то последняя ячейка получает строку, до куда добежали вне зависимости пусто там или нет. была у меня такая фигня. для обхода писал функцию отыскания последней строки, где в цикле бежал вниз по колонке, пока не натыкался на пустую ячейку. некрасиво, медленно, но перелопачивать инет иногда гораздо дольше, ну и если строк немного, работает почти мгновенно. Передаешь ей объект лист и номер колонки по которой будет искаться последняя ячейка

    Код:
     
    public funtion lrc(ws as worksheet, c as integer)
        lrc = 1
        Do While ws.Cells(lrc, c) <> ""
            lrc = lrc + 1
        Loop
    end function
     

    Всего записей: 70 | Зарегистр. 27-07-2006 | Отправлено: 12:35 24-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ilyansk
    Спасибо! Вот об этом я и спрашивал.
    Только, если пустые ячейки все равно включаются в UsedRange, тогда условие  
    Cells(lrc, c) <> "" помогать не должно.
     
    Добавлено:
    Понял, в чем было дело - была просто спрятанная строка и Excel ее посчитал. Всем спасибо

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем добрый День.
    Если в макросе написать Range("C11").Clear то все содержимое ячекй удалится.
    А как написать чтобы удалить  в ячейке формулы и значения, а формат ячейки и условное форматирование оставить.
    Заранее спасибо.

    Всего записей: 27 | Зарегистр. 07-11-2006 | Отправлено: 14:26 24-11-2006
    The okk



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

    Код:
     
    Range("C11").clearcontents

     
    Рекомендую справочник "Справочник VBA 6.3". Гюнтер Штайнер. Жесткий переплет. Компактный. Удобный. 100 руб с копейками. Можно найти практически в любой книжной лавке.
     
    Если с деньгами туго, можно просто открыть в редакторе Object Browser и там искать нужное свойство или метод в нужной библиотеке по части названия.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:57 24-11-2006 | Исправлено: The okk, 15:00 24-11-2006
    kramrus

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

    Цитата:
    Уокенбах, Джон Подробное руководство по созданию формул в Excel 2002.

    Спасибо, но скачать не могу, может еще где то есть?

    Всего записей: 27 | Зарегистр. 07-11-2006 | Отправлено: 16:18 24-11-2006
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Имеется код:
     
    Private Sub OK_Click()
    Dim strDate As String
    strDate = Format(Now(), "dd.mm")
    ActiveSheet.Copy Before:=Sheets(1)
    Sheets(1).Select
    Sheets(1).Name = strDate
    Unload Me
    End Sub
     
    1)Как сделать, что бы не выдавалась ошибка, если лист с именем текущей даты уже существует?
    2)Как сделать, чтобы при открытии книги активным был именно этот лист?
    Заранее благодарен!

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 16:22 24-11-2006
    The okk



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

    Код:
    Private Sub OK_Click()  
    Dim strDate As String  
    strDate = Format(Now(), "dd.mm")  
    ActiveSheet.Copy Before:=Sheets(1)  
    On Error Resume Next                  'забить на ошибки и идти дальше
    Sheets(1).Name = strDate  
    On Error Goto 0                            'перестать забивать на ошибки
    Unload Me  
    Sheets(1).Activate                        'активация листа
    End Sub  
     

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 17:36 24-11-2006 | Исправлено: The okk, 17:39 24-11-2006
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    Нормальный ход, только создается лист с таким же именем (2).
    Нужно, чтоб операция не продолжалась…  
    Еще лучше если выскочит сообщение: «лист с таким именем уже есть»

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 17:47 24-11-2006
    Troitsky



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

    Цитата:
    1)Как сделать, что бы не выдавалась ошибка, если лист с именем текущей даты уже существует?

    Поскольку лист с именем текущей даты вставляется у тебя первым листом
    Цитата:
    ActiveSheet.Copy Before:=Sheets(1)
    то можно делать простую проверку:
    Код:
      If Sheets(1).Name <> strDate Then
        ActiveSheet.Copy Before:=Sheets(1)
        Sheets(1).Select
        Sheets(1).Name = strDate
      End If


    Цитата:
    2)Как сделать, чтобы при открытии книги активным был именно этот лист?  
    Заранее благодарен!
    При открытии книги активным остается тот лист, который был активным при ее закрытии. Если при закрытии книги активным был какой то левый лист, а тебе нужно активировать лист с последней датой, то нужно на событие открытия книги навесить такой код:
    Код:
    Private Sub Workbook_Open()
      Sheets(1).Activate
    End Sub
    Разумеется основываемся на том что лист с именем текущей даты вставляется у тебя первым листом.


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

    Всего записей: 794 | Зарегистр. 13-12-2003 | Отправлено: 17:53 24-11-2006
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Огромное спасибо ВСЕ работает!
    PS: Если листу присваивается имя текущего дня (напр.: 24.11), возможно ли указать при открытии книги, что именно лист текущего дня должен быть активным?

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 18:23 24-11-2006
    Troitsky



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

    Цитата:
     Если листу присваивается имя текущего дня (напр.: 24.11), возможно ли указать при открытии книги, что именно лист текущего дня должен быть активным?

    В смысле?
    Код:
    Sheets(Format(Now(), "dd.mm")).Activate
    это имеешь в виду?


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

    Всего записей: 794 | Зарегистр. 13-12-2003 | Отправлено: 18:36 24-11-2006
    The okk



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

    Код:
     
    Private Sub Workbook_Open()  
    On Error Resume Next ' - на случай, если лист не создан. А то будет ошибку выдавать
      Sheets(Format(Now(), "dd.mm")).Activate  
    On Error Goto 0
    End Sub  

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 18:41 24-11-2006
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    The okk
    ДА! Именно то, что надо!
    Низкий ВАМ поклон!

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 20:43 24-11-2006
    EDELSTAR

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как открыть картинку и чтобы через пару сек. она пропала (некое шоу)

    Всего записей: 1 | Зарегистр. 25-11-2006 | Отправлено: 18:54 25-11-2006
    Reznikoff

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Товарищи, подскажити плз.
    Есть книга. в ней два листа.
    При изменении ширины и высоты стобцов в первом листе, они точно так же меняются во втором.
    Тоже самое с цветом заливки ячейки.
    Так у меня не работает:
     
    Sheets("Лист2").Range(Target.Address).Interior.ColorIndex = Target.Interior.ColorIndex
    Sheets("Лист2").Range(Target.Address).Interior.Pattern = Target.Interior.Pattern
     
    Тоже самое: если я нарисую таблицу в первом листе, то будет такая же таблица во втором.
     
    А вобще мне надо при любом изменении в первом листе, делать такие же изменение во втором (т.е. один лист будет копией другого). Но в некоторых ячейках надо изменять все, кроме текста. До этого делал так: к первому листу привязывал скрипт:
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Sheets("&#203;&#232;&#241;&#242;2").Range(Target.Address).Value = Target.Value
    Sheets("&#203;&#232;&#241;&#242;2").Range(Target.Address).Font.Size = Target.Font.Size
    Sheets("&#203;&#232;&#241;&#242;2").Range(Target.Address).Font.Name = Target.Font.Name
    Sheets("&#203;&#232;&#241;&#242;2").Range(Target.Address).Font.ColorIndex = Target.Font.ColorIndex
    Sheets("&#203;&#232;&#241;&#242;2").Range(Target.Address).Font.Bold = Target.Font.Bold
    Sheets("&#203;&#232;&#241;&#242;2").Range(Target.Address).Font.Underline = Target.Font.Underline
    Sheets("&#203;&#232;&#241;&#242;2").Range(Target.Address).Font.Italic = Target.Font.Italic
    Sheets("&#203;&#232;&#241;&#242;2").Range(Target.Address).Interior.ColorIndex = Target.Interior.ColorIndex
    Sheets("&#203;&#232;&#241;&#242;2").Range(Target.Address).Interior.Pattern = Target.Interior.Pattern
     
    End Sub
     
    Может можно проще сделать?
     
    там в скобках "Лист2"

    Всего записей: 62 | Зарегистр. 18-07-2005 | Отправлено: 10:46 26-11-2006 | Исправлено: Reznikoff, 11:20 26-11-2006
    Troitsky



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Reznikoff
    Насколько себе представляю ситуацию, при изменении формата ячейки (заливка, цвет шрифта и пр.) событие Worksheet_Change книги не возникает. Как такие изменения отловить я затрудняюсь сказать. Поэтому целесообразным считаю изменения во второй лист вносить только при его активации (ну или в случае особой надобности):
    Код:
    Private Sub Worksheet_Activate()
      Sheets(1).Cells.Copy
      Sheets(2).Cells.PasteSpecial
      Application.CutCopyMode = False
      Sheets(2).Cells(1, 1).Select
    End Sub
    В таком случае во втором листе полностью будет повторяться первый, вплоть до скрытых строк, групп и структуры и т.д.
     
     
    Добавлено:
    EDELSTAR

    Цитата:
    Как открыть картинку и чтобы через пару сек. она пропала

    Что имеется в виду под фразой "открыть картинку"? Если вопрос о заставке, то посмотри первую страницу топика, там есть решения.


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

    Всего записей: 794 | Зарегистр. 13-12-2003 | Отправлено: 15:56 26-11-2006 | Исправлено: Troitsky, 16:28 26-11-2006
    Reznikoff

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

    Цитата:
    В таком случае во втором листе полностью будет повторяться первый, вплоть до скрытых строк, групп и структуры и т.д.  

    спасибо конечно, но многовато будет. Надо копировать все, но кроме определенных значений (т.е. будет все тоже, но без текста). как сделать?
    далее делаю для второго листа:
     
    Private Sub Worksheet_Activate()
    Sheets("Лист2").Range("$A1:$HS644").Interior.ColorIndex = Sheets("Лист1").Range("$A1:$HS644").Interior.ColorIndex
    Sheets("Лист2").Range("$A1:$HS644").Interior.Pattern = Sheets("Лист1").Range("$A1:$HS644").Interior.Pattern
    End Sub
     
    Изменяю цвет в ячейки в первом листе. включаю второй, а там ничего не меняется. а вроде по задумке должно.

    Всего записей: 62 | Зарегистр. 18-07-2005 | Отправлено: 16:48 26-11-2006 | Исправлено: Reznikoff, 17:18 26-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.Board
    © Ru.Board 2000-2018

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru