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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Сделал все как ты сказал: создал файл personal.xls в папке XLSTART. И в этот файл сохранил написанный выше программный код, запустил макрос. Теперь все в порядке: какой бы файл я не открывал - клавиатура переключается автоматически!  
    Но теперь новая напасть... когда я открываю новый файл (кликаю на ярлык Excel), ему автоматически присваивается новое имя Personal.xls (раньше присваивалось Книга1) и по умолчанию он пытается его сохранить как раз в папку XLSTART, поэтому приходится каждый раз вручную возвращаться в папку Мои документы и переименовывать в Книгу1. При этом в строке Рабочий каталог я оставил путь E:\Documents and Settings\User1\Мои документы, куда раньше сохранялись мои созданные документы - но это не помогло... Как то можно и от этого избавиться?
    P.S. Еще, когда потом открываю этот документ (например, Книга1) автоматически открывается и Personal.xls. В общем, опять я явно что-то не то сделал.

    Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 10:08 07-11-2006 | Исправлено: Antananarivu, 11:38 07-11-2006
    kramrus

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем!
    Есть куча книг, название каждой - название месяца.В ячейке А1 пишим месяц.
    Нужна формула или макрос чтобы автоматом извлекалость название месяца из А1, минус 1 и вытаскивается С11 из книги "месяц-1" Лист 23 ячейка С12.
    Простите что путано побпробую по другому.
    А1=сентябрь, С11=D:\[август]Лист 23!С12

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kramrus
    Alt-F11, на своей книге Insert | Module (Вставить / Модуль)
    там пишешь приблизительно такой текст:
    Код:
    Function PrevMonth(c As Range)
    PrevMonth = ""
    If UCase(c.Value) = "СЕНТЯБРЬ" Then
        PrevMonth = "D:\[Август]Лист23!$C$12"
    End If
    End Function
     

    потом сохраняешь, и  в ячейке C11 пишешь
      =ДВССЫЛ( PrevMonth(A1) )
     
    Добавлено
    ДВССЫЛ работает только при открытой книге.
    т.е. всё, что я выше написал - в ТОПКУ... ;-((( Сорри

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 20:27 07-11-2006 | Исправлено: SERGE_BLIZNUK, 20:59 07-11-2006
    Antananarivu

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Люди... не дайте пропасть.. немного же осталось! Как мне разобраться с этим personal.xls!
     
    Добавлено:
    Ну слава Богу...сам разобрался... Тормозил.. Но и вы тоже хороши... ломались подсказать! Естественно никакого personal.xls не надо было создавать искуственно - он сам появляется, когда запишешь хотя бы один макрос! А я создавал его руками - отсюда видимо задваивание файла (ну я так для себя понял) и дикие глюки... Или вы уже настолько продвинутые программеры, что не можете себе представить пользователя, у которого нет ни одного написанного макроса?

    Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 01:17 08-11-2006 | Исправлено: Antananarivu, 01:57 08-11-2006
    SERGE_BLIZNUK

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

    Цитата:
    название месяца из А1, минус 1 и вытаскивается С11 из книги "месяц-1" Лист 23 ячейка С12.  
    Простите что путано побпробую по другому.  
    А1=сентябрь, С11=D:\[август]Лист 23!С12  

    в ячейку C11 должно попасть значение из 23 листа или можно обойтись ссылкой?
     
    нашёл как это сделать, но только макросом, через функцию не получилось ;-(((

    Код:
     
    Sub Макрос1()
    Range("C11").Clear
    If UCase(Range("A2").Value) = "СЕНТЯБРЬ" Then
      Range("C11").Formula = "='D:\[Август.xls]Лист23'!$C$12"
    End If
    If UCase(Range("A2").Value) = "ОКТЯБРЬ" Then
      Range("C11").Formula = "='D:\[Сентябрь.xls]Лист23'!$C$12"
    End If
    End Sub
     

     
    удачи.
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 06:37 08-11-2006
    Ilyansk

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Провел в поиске пол-дня... Туплю, наверное.
    Вобщем, заколебал меня этот Эксель со своими "мозгами".
    Закачиваю текстовый файл с колонками текста, цифр, дат. Он формируется извне.
    Даты в нем идут в формате dd.mm.yyyy , а т.к. системный разделитель даты у меня "/", то энти даты эксель воспринимает, как текст. Тупая замена с вызовом вручную "Поиск/Замена" точки на слэш приводит эксель в чувство и  01.10.2006 становится  1/10/2006, но (!). Применение метода Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart,    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False,        ReplaceFormat:=False дает результат 10/01/2006, и функция МЕСЯЦ уже вместо октября возвращает ЯНВАРЬ, что не есть гут. Куда "рыть"?
     

    Всего записей: 70 | Зарегистр. 27-07-2006 | Отправлено: 09:48 08-11-2006
    kramrus

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо за макрос.
    НО! Можно ли в макросе в пути ссылки указать вместо месяца ячейку в которой находится название месяца. Если А1=Январь, А2=декабрь, А3=ноябрь.
    И еще еслинужно в ячейки С11....С32 вставить значение из нужной книги, ячейки С23...С44???????

    Всего записей: 27 | Зарегистр. 07-11-2006 | Отправлено: 12:57 08-11-2006
    razhev



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Подскажите плиз !
    как в Worksheet_Calculate()
    получить адрес ячейки которая пересчиталась ?

    Всего записей: 13 | Зарегистр. 11-01-2003 | Отправлено: 14:14 08-11-2006
    Ilyansk

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    to Kramus
    Макрос и так берет ячейку... Не очень понятен первый вопрос.
     
     
    По второму вопросу:
    В макросе (вместо "Лист23" вставьте нужный)
    ' пробежимся по ячекам С11-С32 активного листа

    Код:
    for i=11 to 32
       Range("C"+cstr(i)).Formula = "='D:\[нужная книга.xls]Лист23'!$C$"+cstr(i+12)
    next

     
     
    Добавлено:
    razhev
     
    В экселе два режима пересчета автоматический и по команде. Думаю, проследить процесс пересчета, а тем более перехватить его где-то посередине не получится.
    Есть свойство полей сводных таблиц (pivot) IsCalculated  true если персчитано, false - нет

    Цитата:
     
    set pt = Worksheets(1).PivotTables("Pivot1")
    For Each fld in pt.PivotFields
        If fld.IsCalculated Then pt.EnableFieldDialog = False
    Next
     

     
    По команде можно пересчитать всю книгу Application.Calculate, лист  Worksheets(1).Calculate или диапазон ячеек Worksheets(1).Rows(2).Calculate

    Всего записей: 70 | Зарегистр. 27-07-2006 | Отправлено: 14:21 08-11-2006 | Исправлено: Ilyansk, 14:45 08-11-2006
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kramrusМожно ли в макросе в пути ссылки указать вместо месяца ячейку в которой находится название месяца. Если А1=Январь, А2=декабрь, А3=ноябрь. [/q]
    можно... только я не понял, что вы хотите... ;-))
    можно так, выделяете любую ячейку, запускаете макрос, тот месяц, который в текущей ячейке, и случит для вычислений.

    Цитата:
    еслинужно в ячейки С11....С32 вставить значение из нужной книги, ячейки С23...С44???????

    легко - через цикл. ;-)

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



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

    Цитата:
    Ilyansk

     
    Дело в том что у меня в єтой ячейке автосумма
    и мне надо проверять, если пересчиталась ячейка то делать проверку и  
    просить ввести коментарии.
     
    по этому мне надо чёткую ячейку

    Всего записей: 13 | Зарегистр. 11-01-2003 | Отправлено: 15:19 08-11-2006
    Troitsky



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

    Цитата:
    Дело в том что у меня в єтой ячейке автосумма  
    и мне надо проверять, если пересчиталась ячейка то делать проверку и  
    просить ввести коментарии.

    Если правильно понял задачу, то можно попробовать выкрутиться следующим образом. Присвоить переменной текущее значение контролируемой ячейки и при пересчете листа проверять не изменилось ли значение этой ячейки (сравниваем с переменной). В случае если изменилось, просим ввести коментарий и присваиваем переменной новое значение.
    Код примерно такой:
    Код:
    Dim mSum As Double
     
    Private Sub Worksheet_Activate()
      mSum = Worksheets(1).Cells(3, 3).Value
    End Sub
     
    Private Sub Worksheet_Calculate()
      If Worksheets(1).Cells(3, 3).Value <> mSum Then
        MsgBox "просим ввести коментарии"
        mSum = Worksheets(1).Cells(3, 3).Value
      End If
    End Sub

     


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

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Цитата:
    В случае если изменилось, просим ввести коментарий и присваиваем переменной новое значение.  
    Красивое решение! А ещё можно вместо переменной использовать ячейку в таблице (можно в скрытом стобце или цвет букв = белый) сравнивать с автосуммой...
    Но с переменной, разумеется, красивее!

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Планировщик WinXP открывает в определенное время книгу, выполняется макрос – заносятся данные, книга закрывается.
    Возможно ли открытие книги в фоновом режиме или в каком-либо другом, чтобы не мешало работать?

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

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    alin,
    может быть в ВАТ или CMD попробовать start /minimize <книга.xls>? Ну и в auto_open навтыкать что-нить вроде    Application.ScreenUpdating = False
     
    А кто-нить может скажет почему "Поиск-Замена" вызванная вручную и она же, вызванная из макроса, дают разные результаты?

    Всего записей: 70 | Зарегистр. 27-07-2006 | Отправлено: 06:24 09-11-2006 | Исправлено: Ilyansk, 06:28 09-11-2006
    kramrus

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    Может не правильно понял, может объяснил, но не работает.
    Привожу пример из своей книги.....
    Чтобы не терять изменения в начале месяца берем таблицу прошлого месяца, копирум, переименовуем. В ячейке AT8=ноябрь, в ячейкеСА8="D:\["&AT8-1&".xls]лист20!"=D:\[Октябрь]лист20.
    в ячейке CA19 пишем такую формулу =ИНДЕКС('D:\[Октябрь.xls]лист20'!$F$19:$BY$418;ПОИСКПОЗ(F19;'D:\[Октябрь 2006.xls]лист20'!$F$19:$F$418;0)+2;57) (берем значение из ячейки F19 ищем в книге Октябрь такое же, спускаемся на 2 строки вниз и берм значение из 57 столба.)
    Все работает. Но! В запарке забываю переписать ручками название книги. Можно что то сделать что бы при изменени А8 или СА8 в ячеке СА 19 автоматически менялось название книги?????
    И еще формула в СА19 копирутся через три строки в этом столбике 56 раз.

    Всего записей: 27 | Зарегистр. 07-11-2006 | Отправлено: 11:34 09-11-2006
    razhev



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Troitsky
     
    У меня біла такая идея, но она улитучелась в связи с большим количеством проверяеміх ячеек.
    можно конечно делать полную копию листа на другой какой нибуть лист при открытии, а потом сверять....
     
    но геморно

    Всего записей: 13 | Зарегистр. 11-01-2003 | Отправлено: 11:47 09-11-2006
    xmm2005



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите как в поле формы VBA в Екселе поставить шаблон на ввод определенного типа число/дата например такое вообще реально ???

    Всего записей: 6 | Зарегистр. 08-02-2005 | Отправлено: 14:34 09-11-2006
    SERGE_BLIZNUK

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

    Цитата:
    Можно что то сделать что бы при изменени А8 или СА8 в ячеке СА 19 автоматически менялось название книги?????  

    можно. Тут главная проблема - но, решаемая ;-))) -
     на какое событие можно повесить контроль. на Workbook.Change - самое надёжное, но самое малоэффективное (на любое изменение любой ячейки мы будем выполнять свой код.) Конечно, там видно, какую ячейку поменяли, но это не прибавит быстродействия - хотя, если устроит скорость - это самый подходящий вариант.
    Можно повеситься на Workbook.Open (при открытии книги будут проверяться все формулы и они будут автоматически корректироваться.
    Ещё - оригинал формулы C19 для алгоритма корректировки очень желательно сохранить в виде шаблона где-нибудь в невидимой ячейки например, в виде следующего текста:
    Код:
    ИНДЕКС('D:\[$$$]лист20'!$F$19:$BY$418;ПОИСКПОЗ(F34;'D:\[$$$]лист20'!$F$19:$F$418;0)+2;57)

    тогда легко заменять [$$$] на нужный месяц...
     
    по поводу корректировки формул - можно написать макрос.  
    Может завтра набросаю. НО! Начал проверять - а что это у вас - описка или что?
    Цитата:
     

    Код:
    ИНДЕКС('D:\[Октябрь.xls]лист20'!$F$19:$BY$418;ПОИСКПОЗ(F34;'D:\[Октябрь 2006.xls]лист20'!$F$19:$F$418;0)+2;57)
    Данные берутся из таблицы Октябрь.xls или из Октябрь 2006.xls ???!
     

    Цитата:
    И еще формула в СА19 копирутся через три строки в этом столбике 56 ра
    а это я не совсем понял...  
    интуитивно чувствую, что у вас одна и та же формула 56 раз используется?  
    (C19 .. C23 .. C27 и т.д. )?
    это легко решается через цикл. вроде такого Подробнее...
     

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Кто знает как открыть запороленный VBAProject?

    Всего записей: 156 | Зарегистр. 24-09-2004 | Отправлено: 02:00 10-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