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

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

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

    Цитата:
    Проверь Сервис - Совместное использование. Если включено, макросы блокируются.

    Спасибо большое. Помогло. Буду ковырять макросы.

    Всего записей: 2 | Зарегистр. 12-08-2005 | Отправлено: 12:59 10-07-2006
    Virtualexx



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Такое вот еще дело:
    В ячейке - дата
    Код:
    =СЕГОДНЯ()
    допустим 31.07.2006, в соседней ячейке функция:
    Код:
    =ЕСЛИ(A33="10.07.2006";"Внимание: последний день месяца!";"")

    но она не работает, показывает "ложь", т.е. пустое поле.  
    Так:
    Код:
    =ЕСЛИ(СЕГОДНЯ()="10.07.2006";"Внимание: последний день месяца!";"")
     тоже не работает...

    Всего записей: 10 | Зарегистр. 06-07-2006 | Отправлено: 15:49 10-07-2006 | Исправлено: Virtualexx, 15:56 10-07-2006
    Anjin_Kazawa



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Virtualexx
    Дата в экселе представлена числом, надо так:

    Код:
    =ЕСЛИ(СЕГОДНЯ()=ДАТАЗНАЧ("10.07.2006");"Внимание: последний день месяца!";"")

    Всего записей: 396 | Зарегистр. 08-06-2005 | Отправлено: 16:42 10-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Virtualexx
    см мой ответ eowyn - при совместном использовании макросы блокируются.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 18:21 10-07-2006
    Virtualexx



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Anjin_Kazawa
    спасибо!!!
     
    Yuk
    Мне не хотелось бы сглазить, но у меня макросы работают при совместном использовании. Результат отображается после сохранения активной книги.
     
    Добавлено:
    Еще вот: есть ли функции, позволяющие определить последнюю дату текущего месяца?

    Всего записей: 10 | Зарегистр. 06-07-2006 | Отправлено: 10:56 11-07-2006
    Anjin_Kazawa



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

    Цитата:
    Еще вот: есть ли функции, позволяющие определить последнюю дату текущего месяца?

    Пример получения последнего дня месяца июля 2006 года.

    Код:
    =КОНМЕСЯЦА(ДАТАЗНАЧ("1/7/2006");0)

    Всего записей: 396 | Зарегистр. 08-06-2005 | Отправлено: 12:20 11-07-2006 | Исправлено: Anjin_Kazawa, 12:21 11-07-2006
    Nightcrawler

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

    Цитата:
    Еще вот: есть ли функции, позволяющие определить последнюю дату текущего месяца?

     
    не совсем то, но по крайней мере, не надо последний день каждый раз забивать вручную:
    =IF(МЕСЯЦ(СЕГОДНЯ())<>МЕСЯЦ(СЕГОДНЯ()+1);"Внимание: последний день месяца!";"")

    Всего записей: 98 | Зарегистр. 11-05-2004 | Отправлено: 12:20 11-07-2006
    SERGE_BLIZNUK

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

    Цитата:
    есть ли функции, позволяющие определить последнюю дату текущего месяца?  


    Цитата:
    =КОНМЕСЯЦА(ДАТАЗНАЧ("1/7/2006");0)  

    странно, но у меня в Excel такой функции нет... 8-() ?...  
    можно так:
    Код:
     
    =СЕГОДНЯ()-ДЕНЬ(СЕГОДНЯ()+31)+31
    только не спрашивайте меня, как это работает ;-))

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 13:52 11-07-2006
    Yuk



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

    Цитата:
    Цитата:
    =КОНМЕСЯЦА(ДАТАЗНАЧ("1/7/2006");0)  
    странно, но у меня в Excel такой функции нет

    КОНЕЦМЕСЯЦА = EOMONTH
    Для определения дня:
    Код:
     =ДЕНЬ(КОНЕЦМЕСЯЦА(ДАТАЗНАЧ("1/7/2006");0))

     
    Добавлено:
    Virtualexx

    Цитата:
    у меня макросы работают при совместном использовании
    Макросы автоматические? То есть запускаются обработчиком событий или юзером?

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Борюсь с проблемой висящего в памяти Excel.exe после завершения макроса, осуществляющего процедуру создания док-та MS Word путем слияния :
     
    Внизу приведен код процедуры, которая и оставляет висеть процесс "Excel.exe"
     в памяти после выполнения макроса 'JoinALL' (Вордовский макрос создает в ворде, в свою очередь еще один документ, который является результатом слияния)....
    Вызов макроса в данном примере я закомментировал, т.к. полностью вставил его тело (с соотв ссылками на WordApp) в тело экселевского макроса. Однако месторасположение макроса никоим образом не влияет на результат (excel.exe все равно продолжает висеть в памяти).
     

    Код:
     
    Sub RunContract_Automation()
       
      'Dim Fs As Variant
      Dim ContractPath As String
      Dim WordApp As Word.Application
      Dim WordDoc As Word.Document
      Dim CType As String, CFile As String
     
       
      Set WordApp = CreateObject("Word.Application")
      Set WordDoc = WordApp.Documents.Open _
          (ThisWorkbook.Path & "\" & CFile)
      WordApp.Visible = True
    '  WordApp.RUN "JoinALL"
         
         
    With WordApp.Application
     
    '=========Текст макроса JoinALL Вордовского файла=======
        .ActiveDocument.MailMerge.MainDocumentType = wdFormLetters
        .ActiveDocument.MailMerge.OpenDataSource name:=ActiveDocument.Path & "\WORK.xls", _
            ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
            AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
            WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
            Format:=wdOpenFormatAuto, Connection:= _
            "Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=WORK.xls;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=35;Je" _
            , SQLStatement:="SELECT * FROM Import$`", SQLStatement1:="", SubType:= _
            wdMergeSubTypeAccess
     
            .ActiveDocument.MailMerge.Destination = wdSendToNewDocument
            .ActiveDocument.MailMerge.SuppressBlankLines = True
            .ActiveDocument.MailMerge.DataSource.FirstRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
            .ActiveDocument.MailMerge.DataSource.LastRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
            .ActiveDocument.MailMerge.Execute Pause:=False
    '=============================================================
         
       
         
        With .Dialogs(wdDialogFileSaveAs)
             .name = "D:\NEW\" & ContractName
             .Show
        End With
         
    '    .Quit SaveChanges:=wdDoNotSaveChanges
           
    End With
     
        WordApp.Quit SaveChanges:=wdDoNotSaveChanges
     
      Set WordApp = Nothing
      Set WordDoc = Nothing
       
    End Sub  
     

    В конце, как видно из примера кода, закрывается Вордовский док-т...  
       WordApp.Quit SaveChanges:=wdDoNotSaveChanges
     
      Set WordApp = Nothing
      Set WordDoc = Nothing
     
    Однако их создается 2 (источник с полями слияния, и результат слияния - ворой документ).... Так вот если процедуру слияния в вордовском макросе (либо в вышеприведенном коде) заменить на нечто вроде MsgBox " ", то excel.exe не остается в памяти!
     
    То есть причина тому, что Excel.exe остается висеть в памяти - созданный файл слияния!
     
    Как закрыть все, что связано с Вордовскими файлами слияния?
    Спасибо!

    Всего записей: 139 | Зарегистр. 29-09-2004 | Отправлено: 21:56 11-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SuperMaximus
    А если попробовать закрыть документ перед выходом из ворда?
    WordDoc.Close SaveChanges:=wdDoNotSaveChanges
    Set WordDoc = Nothing
    WordApp.Quit
    Set WordApp = Nothing
    Возможно, проблема в том, что DataSource остается открытым?

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Да, я тоже так думал, но увы... excel.exe продожает висеть в памяти...
    Мне тут один человек ответил из западного форума  
     
    First implicit instantiation of word found here:
    .ActiveDocument.MailMerge.OpenDataSource name:=.ActiveDocument.Path & "\WORK.xls", _
     
    Ссылаясь на то, что неявно обращение происходит к .ActiveDocument.Path & "\WORK.xls"
     
    Проблема где-то здесь...

    Всего записей: 139 | Зарегистр. 29-09-2004 | Отправлено: 23:30 11-07-2006
    SERGE_BLIZNUK

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

    Цитата:
     
    =КОНМЕСЯЦА(ДАТАЗНАЧ("1/7/2006");0)    
     
    КОНЕЦМЕСЯЦА = EOMONTH  
    Для определения дня:

    извините, туплю... но хочу разобраться...
    что и как мне нужно набрать, чтобы этот код заработал?  
    может быть нужно поставить какой-нибудь add-on к Excel ? Повторяю, в моем Excel 2003 через 'Вставка' / 'Функция' / 'Все в алфавитном порядке' - такой функции НЕТ! $-(
    Если вставляю вышеуказанный код в ячейку, выдаёт ошибку #ИМЯ?...

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 05:24 12-07-2006
    RobinStone

    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Господа, подскажите пожалуйста такой момент
    можно ли мне сделать выпадающий список в ячейке
    и если да, то как? делательно без использования элементов управления...
    ведь когда что-то вводишь эксьль может делать предложения по уже вводившися ранее в этот столбец значениям а мне, например надо чтобы пользователь делал выбор из какого-то количества значений
     
    Например, есть три колонки:
    1. Назначение платежа: выпадающий список из N-го количества элементов
    2. Сумма - просто сумма
    3. Сотрудник - опять же выпадающий список из другого количества элементов
     
    Как это примерно можно реализовать?
     
    Заранее спасибо

    Всего записей: 14 | Зарегистр. 27-06-2006 | Отправлено: 06:39 12-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RobinStone
    Задавали не раз в Excel FAQ:
    http://forum.ru-board.com/topic.cgi?forum=5&topic=19106&start=280#4
     
    SERGE_BLIZNUK

    Цитата:
    такой функции НЕТ
    У тебя эксель русский или английский?
     
    SuperMaximus
    Я тоже именно на эту строку подумал. Пока решения не знаю. Пиши, если что прояснится.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 09:03 12-07-2006
    Virtualexx



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    До того, как вводить функцию в ячейку: сервис - надстройки - активировать "пакет анализа", не забыть формат соответствующей ячейки изменить на "дата".  
     
    Yuk

    Цитата:
    Макросы автоматические? То есть запускаются обработчиком событий или юзером?

    Юзером.
     
    Всем спасибо за помощь!

    Всего записей: 10 | Зарегистр. 06-07-2006 | Отправлено: 09:38 12-07-2006 | Исправлено: Virtualexx, 10:11 12-07-2006
    vadimo



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    комрадс, нид хелп!
    задача:  
    из существующей excel-книги отправить по почте определенный лист как вложение.
    т.е. надоть создать пустую книгу, в нее вставить этот лист, книгу сохранить как-то  и отправить эту книгу аттачментом. неполучается чото у меня... (кстати, возможно я усложнил алгоритм, поправьте плиз)
     
    Sub Send()
     
        With Workbooks("vibrators.xls").Worksheets("Изменения")
             .Sheets(9).Copy
     
    ' не знаю как делать save as...  и чего вообще дальше делать, не пойму как перекинуть лист в некую конкретную книгу, еще не знаю как переключиться на книгу, которую excel создал командой .sheets().copy, положив в нее этот лист.
     проперти destination - какая-то лажа, не знаю как его присунуть      
     
    '         .SendMail Recipients:="pupkin@pupkins.cn", Subject:="Изменения " & Format
    (Date, "dd/mmm/yy")
             .Close SaveChanges:=False
        End With
    End Sub

    Всего записей: 169 | Зарегистр. 18-09-2003 | Отправлено: 11:20 12-07-2006 | Исправлено: vadimo, 11:31 12-07-2006
    Virtualexx



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

    Код:
    =КОНМЕСЯЦА(ДАТАЗНАЧ("1/7/2006");0)

     
    А реально ли, вместо "1/7/2006" указать текущий год, чтобы не изменять параметры функции в 2007 году и так далее?

    Всего записей: 10 | Зарегистр. 06-07-2006 | Отправлено: 12:45 12-07-2006
    SERGE_BLIZNUK

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

    Цитата:
    До того, как вводить функцию в ячейку: сервис - надстройки - активировать "пакет анализа", не забыть формат соответствующей ячейки изменить на "дата".  

    Вай, шайтан!! Точно!! Спасибо большое! Разумеется, у меня все пакеты выключены были... (более того, я про это вообще не знал...)

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 13:00 12-07-2006
    Anjin_Kazawa



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

    Цитата:
    А реально ли, вместо "1/7/2006" указать текущий год, чтобы не изменять параметры функции в 2007 году и так далее?

    Можно так, последнее число теущего месяца.

    Код:
    =КОНМЕСЯЦА(ТДАТА();0)

    Всего записей: 396 | Зарегистр. 08-06-2005 | Отправлено: 13:16 12-07-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