Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню FAQ | Макросы | Общие вопросы


Rambler's Top100


Counter CO.KZ


    [1] [2] [3]

  1. Как записать свой собственный макрос ? 2004
  2. Как добавить комментарии в макрос ? 2004
  3. Как закомментировать/раскомментировать целый блок ? 21.03.2007
  4. Как запустить макрос без предупреждения о возможном содержании макровирусов ? 2004
  5. Как осуществить просмотр программного кода нужного макроса ? 28.06.2007
  6. Как приостановить выполнение макроса на определённое время ? 18.02.2007
  7. Как определить время выполнения макроса ? 02.02.2008
  8. Как прервать/остановить выполнение макроса ? 17.01.2006
  9. Как запретить прерывание выполнения макроса ? 17.01.2006
  10. Как отловить нажатие клавиш ESC или CTRL + BREAK ? 17.01.2006
  11. Как на время выполнения макроса заблокировать клавиатуру и мышку, сохранив, при этом, возможность использования диалоговых окон ? 15.09.2007
  12. Как отменить действия совершённые макросом ? Лидер голосования 12.12.2005
  13. Как отменить последнее изменение, совершенное перед выполнением макроса ? 21.03.2011
  14. Как сделать так, чтобы макрос не был виден в списке макросов [ALT+F8] ? 27.03.2006
  15. Как установить пароль на VBProject ? 04.10.2006
  16. Как обратится к ячейке (плюс несколько нестандартных методов выделения ячейки) ? 2004
  17. Как сделать так, чтобы при открытии файла уникальный номер увеличивался (подсчёт количества открытия файла) ? 2004
  18. Как извлечь данные из закрытого файла ? 2004
  19. Как программно создать гиперссылку ? 20.02.2007
  20. Как программно удалить все гиперссылки в нужном рабочем листе ? 31.03.2007
  21. Как программно заменить текст всех гиперссылок на адреса ? 18.03.2011
  22. Как после ввода, автоматически менять интернет адрес на гиперссылку ? 30.09.2011
  23. Как отловить переход по гиперссылке и определить адрес ячейки с этой гиперссылкой ? 28.03.2012
  24. Как создать гиперссылку с помощью пользовательской функции ? 08.04.2012
  25. Как изменить внешний вид курсора мышки ? 19.03.2007
  26. Как отключить обновление экрана ? 13.04.2005
  27. Как не выводить на экран системные предупреждения ? 2004
  28. Как блокировать выполнение событий приложения ? 21.12.2006
  29. Как вывести текст (сообщение, комментарий) :
    в строке состояния ?
    в строке заголовка приложения ?
    28.06.2005
  30. Как вывести в строке состояния(статус баре) процент обработанных ячеек ? 03.05.2007
  31. Как вывести диалоговое окно для ввода данных ? 2004
  32. Как вывести диалоговое окно для ввода числа ? 11.05.2009
  33. Как "отловить" нажатие кнопки Отмена или Закрыть [X], при использовании функции InputBox ? 24.01.2012
  34. Как скрыть ввод данных в диалоговом окне InputBox ? 09.06.2007
  35. Как вывести стандартное диалоговое окно MS Excel ? 20.12.2005
  36. Как "назначить" клавишам свой собственный макрос ? (горячие клавиши для макроса) 28.05.2006
  37. Как имитировать нажатие клавиш ? 16.05.2006
  38. Как получить текст из буфера обмена ? 16.05.2006
  39. Как поместить текст в буфер обмена ?
    Как заменить данные в буфере обмена на свой текст ?
    16.04.2011
  40. Как определить пустой или нет буфер обмена ? 01.05.2015
  41. Как очистить буфер обмена в MS Excel 2000 ? 28.05.2006
  42. Как определить версию приложения ? 14.07.2006
  43. Как использовать дату при применении автофильтра ? Лидер голосования 15.02.2005
  44. Как быстро запустить другое приложение, например Word ? 20.02.2007
  45. Как запустить стандартный Windows калькулятор ? 20.02.2007
    [1] [2] [3]


  • Ответ :
    В меню Сервис выберите пункт Макрос, затем выберите команду Начать запись. Далее в поле Имя макроса введите имя макроса.
    В списке Сохранить в выберите место хранения макроса и нажмите кнопку ОК.
    Выполните все действия в нужном порядке. После окончания нажмите кнопку Остановить.
    Комментарий : Чтобы макрос был доступен для всех рабочих книг, сохраните его в Личной книге макросов.

    Microsoft Excel 2007 Для обладателей этой (и следующих) версии есть более подробное изложение (включая скриншоты) всего вышеизложенного

    Quick start: Create a macro
    Create or delete a macro

  • Ответ :
    Перед текстом комментария поставьте апостроф '
    Можно заменить апостроф на инструкцию Rem
    Комментарий : Текст комментария должен быть зелёного цвета, при условии, что он не был изменён в настройках.
  • Ответ :
    Выделите ту часть кода, который Вы хотите закомментировать или раскомментировать. Затем в меню Вид / View выберите пункт Панели инструментов / ToolBars и команду Правка / Edit. После чего, в зависимости от поставленной задачи, кликните мышкой кнопку Закомментировать блок / Comment Block или Раскомментировать блок / Uncomment Block.
    Совет : Если Вы предполагаете часто осуществлять эти действия, то вышеупомянутые кнопки можно разместить, например, на панели инструментов Стандарт.
  • Ответ :
    Для этого Вам нужно при указании пути для имени макроса, сослаться на другую рабочую книгу, в которой будет находиться макрос.
    Самый простой способ, это создать в "чистой рабочей книге" кнопку и назначить ей Ваш макровирус.
    В меню Вид выберите пункт Панели инструментов, затем нажмите на панель Формы. Далее мышкой выберите тип Кнопка и выбрав место в листе, щёлкните мышкой по ячейке.
    В поле Имя макроса выберите имя нужного макроса и нажмите ОК.
    Комментарий : При желании имя кнопки можно поменять на более приемлемое.
    Чтобы макрос был доступен для выбора рабочая книга должна быть обязательно открыта.
    Примечание : К сожалению, автор слишком поздно занялся сайтостроением, т.к. эта возможность реализована только в MS Office 97. В следующих версиях разработчики исправили свой недостаток и убрали лазейку.
  • Ответ : Скачать пример Актуально для MS Excel 97, 2000, XP
    Выделите ячейку или любой графический об'ект, который поддерживает создание гиперссылки. Затем, в меню Вставка выберите команду Гиперссылка и в поле Имя объекта в документе введите имя модуля и макроса, например Модуль1.Тест и нажмите кнопку ОК. Теперь, для просмотра нужного кода, Вам достаточно будет всего лишь воспользоваться созданой гиперссылкой.

    Комментарий : Если макрос расположен в стандартном модуле и имя Вашего макроса "уникально", т.е. другие модули не содержат макроса с аналогичным именем, то имя модуля можно не указывать.

  • Особенности MS Excel 2000, XP
    В меню Вставка выберите команду Гиперссылка, далее кликните "рисунок с текстом" под номером 1 имеющимся файлом, Web-страницей. Затем, в поле Введите имя файла или Web-страницы введите имя модуля и макроса, например #Модуль1.Тест и нажмите кнопку ОК.
  • Ответ : Скачать пример
    Для того, чтобы приоставить выполнение макроса на определённое время, достаточно использовать метод Wait об'екта Application. Далее следуют пять примеров, которые могут остановить выполнение макроса на десять секунд.
  • Application.Wait Time:=DateAdd("s", 10, Now)
    Application.Wait Time:=Now + #12:00:10 AM#
    Application.Wait Time:=Now + 10 / 86400
    Application.Wait Time:=Now + TimeSerial(0, 0, 10)
    Application.Wait Time:=Now + TimeValue("0:00:10")

  • Ответ :
    Для того, чтобы узнать сколько времени прошло пока выполнялся нужный макрос, можно использовать, например, функцию Timer
  • Private Sub YourMacro()
        iTimer! = Timer
        
        'Здесь должен быть код Вашей программы.
        
        MsgBox "Время выполнения макроса составило " & _
        Timer - iTimer! & " сек.", vbExclamation, ""
        
        MsgBox "Время выполнения макроса составило " & _
        Format((Timer - iTimer!) / 86400, "Long Time"), vbExclamation, ""
    End Sub
    Примечание : Если Вы хотите получить время именно в секундах, то используйте первый MsgBox, если в часах, минутах и секундах, то второй. Если же Вам необходимо получить количество милисекунд или существует вероятность, что Ваш макрос может быть запущен до полуночи, а обработка данных может закончиться после полуночи, то в этих случаях можно использовать следующий [FAQ427]
  • Ответ :
    Вариант I. Нажмите клавишу ESC.
    Вариант II. Или нажмите комбинацию клавиш CTRL + BREAK.
    Затем нажмите кнопку Завершить / End

    Примечание : Этот совет не будет работать, если макрос блокирует нажатие клавиш [FAQ72]
  • Ответ :
  • Application.EnableCancelKey = xlDisabled
    'Здесь должен быть код Вашей программы.
    Application.EnableCancelKey = xlInterrupt

  • Ответ : Скачать пример
  • On Error GoTo CancelHandler

    Application.EnableCancelKey = xlErrorHandler

    'Здесь должен быть код Вашей программы.

    CancelHandler:
    Application.EnableCancelKey = xlInterrupt

    If Err.Number = 18 Then _
       MsgBox "Вы нажали кнопку ESC или CTRL + BREAK"

  • Ответ :
  • Application.Interactive = False
    'Здесь должен быть код Вашей программы.
    Application.Interactive = True

  • Ответ : Вопрос выбран посетителями Скачать пример
    Вариант I. Перед запуском макроса сохраните Вашу рабочую книгу. Для отмены всех изменений, в этой рабочей книге, просто закройте её. На вопрос о сохранение файла выберите вариант Нет.

    Примечание : Этот вариант не будет работать, если в процессе выполнения макроса, рабочая книга была сохранена.

    Дополнение : Если Вы захотите проделать тоже самое, но программно, то используя метод OnUndo об'екта Application можно добиться отмены действий макроса с помощью стандартных команд (см. пример)

    Вариант II. В меню Сервис выберите команду Доступ к книге, выделите закладку Правка. Далее установите "флажок" напротив Разрешить совместный доступ и нажмите кнопку ОК. Затем на все вопросы отвечайте ОК.
    Для просмотра и отмены изменений в этой рабочей книге выберите в меню Сервис пункт Исправления, а затем команду Принять/отклонить исправления.

    Примечание : Общая книга имеет ряд ограничений, которые обязательно необходимо учитывать при работе с подобной книгой.
  • Ответ :

    Для того, чтобы отменить последнее изменение, совершенное перед выполнением макроса, достаточно использовать метод Undo об'екта Application
  • Application.Undo
    Примечание : Выполнение этой инструкции даёт тот же результат, что и нажатие кнопки Отменить с панели инструментов Стандартная (или аналогичной команды в меню Правка), однако, если отменить ничего нельзя, то в таком случае возникнет ошибка.

    Список вопросов и ответов, где применяется метод Undo, прилагается :

  • Kак запретить изменение данных в диапазоне (т.е. запретить изменение данных более чем в одной ячейке) ?
  • Как в рабочем листе запретить ввод или вставку скопированных данных содержащих текст ?
  • Как в определённом диапазоне запретить ввод или вставку скопированных данных содержащих текст ?
  • Как в рабочем листе запретить ввод или вставку скопированных данных содержащих числа ?
  • Как в определённом диапазоне запретить ввод или вставку скопированных данных содержащих числа ?
  • Как в рабочем листе или определённых ячейках листа запретить ввод, редактирование или вставку скопированных данных, содержащих формулы ?
  • Ответ :
    Укажите процедуру с ключевым словом Private, например :
  • Private Sub Test()
        MsgBox "Hello, World", vbSystemModal, ""
    End Sub
    Или используйте инструкцию Option Private Module которая должна располагаться перед программами и функциями.
  • Ответ :
    В меню Сервис выберите пункт Макрос и команду Редактор Visual Basic (ALT + F11)
    После чего в меню Сервис / Tools выберите команду Свойства VBAProject / VBAProject Properties и в появившемся стандартном диалоговом окне выделите закладку Защита / Protection
    Затем обязательно установите "флажок" напротив Блокировать просмотр проекта / Lock project for viewing, введите один и тот же пароль в поля Пароль / Password и Подтвержение пароля / Confirm password и нажмите кнопку OK.
    Теперь в меню Файл / File выберите команды Сохранить / Save (CTRL + S) и Закрыть и вернуться ... / Close and Return ... (ALT + Q)

    Комментарий : Установка пароля на VBProject не является гарантией от просмотра Вашего кода, так как на сегодняшний день существуют программы по определению и снятию пароля.
  • Ответ :
  • Range("B5").Select
    Range("$B$5").Select
    Range("Дата").Select
    Range("B" & 5).Select

    [B5].Select
    [Дата].Select

    Range("A5").Next.Select
    Range("C5").Previous.Select

    Range("A5").Range("B1").Select
    Range("B1").Range("A5").Select

    Application.Goto Range("B5")
    Application.Goto Reference:=Range("B5")
    Application.Goto Reference:=Range("Дата")
    Application.Goto "Дата"
    Application.Goto [Дата]
    Application.Goto Reference:="Дата"
    Application.Goto Reference:=[Дата]

    Range(Names!Дата).Select
    Range(ThisWorkbook.Names!Дата).Select
    Range(Application.Names!Дата).Select

    Range(Names("Дата")).Select
    Range(ThisWorkbook.Names("Дата")).Select
    Range(Application.Names("Дата")).Select

    Names!Дата.RefersToRange.Select
    ThisWorkbook.Names!Дата.RefersToRange.Select
    Application.Names!Дата.RefersToRange.Select

    Names("Дата").RefersToRange.Select
    ThisWorkbook.Names("Дата").RefersToRange.Select
    Application.Names("Дата").RefersToRange.Select

    Range("B5:B10").Item(1).Select
    Range("B5:B10").Item(1, 1).Select
    Range("A5:CM5").Item(1, 2).Select
    Range("B1:B10").Item(5).Select
    Range("B1:B10").Item(5, 1).Select
    Range("C1:D10").Item(5, 0).Select
    Range("D1:H50").Item(5, -1).Select
    Range("A17:E15").Item(-9, 2).Select
    Range("D10:E15").Item(-4, -1).Select

    Range("B5:B10")(1).Select
    Range("B5:B10")(1, 1).Select
    Range("D1:H50")(5, -1).Select
    Range("A17:E15")(-9, 2).Select
    Range("D10:E15")(-4, -1).Select

    Range("B5:B10").Cells(1).Select
    Range("B5:B10").Cells(1, 1).Select
    Range("A5:CM5").Cells(1, 2).Select
    Range("B1:B10").Cells(5).Select
    Range("B1:B10").Cells(5, 1).Select
    Range("C1:D10").Cells(5, 0).Select
    Range("D1:H50").Cells(5, -1).Select
    Range("A17:E15").Cells(-9, 2).Select
    Range("D10:E15").Cells(-4, -1).Select

    Range("B:B").Item(5).Select
    Range("B:B").Cells(5).Select
    Range("B:B").Rows(5).Select
    Range("B:B").Rows("5:5").Select

    Range("5:5").Item(2).Select
    Range("5:5").Cells(2).Select
    Range("5:5").Columns(2).Select
    Range("5:5").Columns("B").Select
    Range("5:5").Columns("B:B").Select

    Range("B:B 5:5").Select
    Range("B:B" & " " & "5:5").Select

    Range("B1").Offset(4).Select
    Range("C1").Offset(4, -1).Select
    Range("C10").Offset(-5, -1).Select

    Range("B5,B5").Select

    [B5:B5].Select
    [B5.B5].Select
    Range("B5.B5").Select
    Range("B5:B5").Select
    Range("B5:B5:B5").Select
    Range("B5", "B5").Select
    Range("$B$5", "$B$5").Select
    Range("B5", Range("B5")).Select
    Range(Range("B5"), "B5").Select
    Range(Range("B5"), Range("B5")).Select

    Range(Cells(1026), Cells(1026)).Select
    Range(Cells(5, 2), Cells(5, 2)).Select
    Range(Cells(5, "B"), Cells(5, "B")).Select
    Range(Cells(5, "B:B"), Cells(5, "B:B")).Select

    Cells(5, 2).Select
    Cells(5, "B").Select
    Cells(5, "B:B").Select
    Cells(1026).Select

    Rows(5).Cells(2).Select
    Rows(5).Columns(2).Select
    Rows(5).Columns("B").Select
    Rows(5).Columns("B:B").Select
    Rows("5:5").Columns("B").Select
    Rows("5:5").Columns("B:B").Select

    Columns(2).Cells(5).Select
    Columns(2).Rows(5).Select
    Columns(2).Rows("5:5").Select
    Columns("B").Cells(5).Select
    Columns("B").Rows(5).Select
    Columns("B").Rows("5:5").Select
    Columns("B:B").Cells(5).Select
    Columns("B:B").Rows(5).Select
    Columns("B:B").Rows("5:5").Select
    Примечание :
  • - Во всех примерах выделяется ячейка "B5"
  • - Для реализации примера № 3, 6, 13-29 ячейка должна быть именованной (Дата)
    [Как присвоить имя ячейке средствами VBA]
    [Как присвоить имя ячейке стандартными средствами]
  • - Пример № 67 нужно использовать для работы с несмежными ячейками и/или диапазоном
  • - Примеры № 68-81 нужно использовать для работы с диапазоном ячеек

    * - Автор примеров № 18-23 - Steven Roman
    ** - Автор примера № 69 - Richard Shepherd

    Комментарий : Выделение ячейки используется только для наглядности, в действительности же, реальная необходимость в активации и выделении, возникает крайне редко.
  • Ответ :
    Для подсчёта количества открытия файла и вывода результата в ячейке A1, разместите в любом стандартном модуле :
  • Private Sub Auto_Open()
        Worksheets(1).Cells(1) = Worksheets(1).Cells(1) + 1 ' Вариант I.
        Worksheets(1).Cells(1, 1) = Worksheets(1).Cells(1, 1) + 1 ' Вариант II.
        Worksheets(1).Range("A1") = Worksheets(1).Range("A1") + 1 ' Вариант III.
    End Sub
    Примечание :
  • Если в ячейку A1 будут введены данные отличные от числовых, то Вы получите ошибку.
  • Для решения поставленной задачи, можно также использовать события рабочей книги, например Workbook_Open()
  • Для работы этого кода достаточно выбрать любой из трёх предложенных вариантов или использовать другие способы, смотрите предыдущий вопрос ...
  • Ответ :
  • Range("A1").Formula = "='" & iPath & "[" & iFile & "]" & iList & "'!" & "A1"
    Range("A1") = Range("A1")
    Bonus : извлечение данных из 100 ячеек
    Range("A1:A100").Formula = "='" & iPath & "[" & iFile & "]" & iList & "'!" & "A1"
    Range("A1:A100") = Range("A1:A100").Value
    Если ячейки, данные которых требуется извлечь, могут быть пусты, то после "импорта" необходимо также удалить 0 , например так :
    With Range("A1:A100")
         .Formula = "='" & iPath & "[" & iFile & "]" & iList & "'!" & "A1"
         .Value = .Value
         .Replace "0", "", xlWhole
    End With
    Если же в исходном диапазоне могут встречаться как пустые ячейки, так и ячейки, содержащие 0, то в таком случае, можно просто усложнить формулу :
    iFormula = "'" & iPath & "[" & iFile & "]" & iList & "'!" & "A1"
    iFormula = "=IF(ISBLANK(" & iFormula & "),""""," & iFormula & ")"

    Range("A1:A100").Formula = iFormula
    Range("A1:A100") = Range("A1:A100").Value
  • Второй способ (для записи данных в переменную) :
  • iAddress = "'" & iPath & "[" & iFile & "]" & iList & "'!" & Range("A1").Address(ReferenceStyle:=xlR1C1)
    iData = ExecuteExcel4Macro(iAddress)
    Предполагается, что :
  • iPath - это месторасположения файла (каталог)
    Обратите внимание, что путь к файлу должен быть указан полностью, например вот так :
    "C:\Katalog\"
  • iFile - это название файла - донора
  • iList - это название листа в файле из которого мы извлекаем данные
  • "A1" - это адрес ячейки из которой нам нужно получить данные

    P.S. Если файл - донор и файл - extractor находятся в одном каталоге (папке), то " & iPath & " - можно убрать
  • Ответ :

    Как программно создать гиперссылку ? 20.02.2007
  • Ответ :

    Как программно удалить все гиперссылки в нужном рабочем листе ? 31.03.2007
  • Ответ :

    Как программно заменить текст всех гиперссылок на адреса ? 18.03.2011
  • Ответ :

    Как после ввода, автоматически менять интернет адрес на гиперссылку ? NEW 30.09.2011
  • Ответ :

    Как отловить переход по гиперссылке и определить адрес ячейки с этой гиперссылкой ? NEW 28.03.2012
  • Ответ :
  • Application.Cursor = xlWait ' xlIBeam 'xlNorthwestArrow
    Application.Cursor = xlDefault 'восстановить

  • Ответ :
  • Application.ScreenUpdating = False
    'Здесь должен быть код Вашей программы.
    Application.ScreenUpdating = True

  • Ответ :
  • Application.DisplayAlerts = False
    'Здесь должен быть код Вашей программы.
    Application.DisplayAlerts = True

  • Ответ : Актуально для MS Excel 97, 2000, XP
  • Application.EnableEvents = False
    'Здесь должен быть код Вашей программы.
    Application.EnableEvents = True

  • Ответ :
  • Application.StatusBar = "Вирус запущен"
    Application.Caption = "В Багдаде всё спокойно"
    ActiveWindow.Caption = ""
    Для того, чтобы восстановить исходные значения, необходимо :
    Application.StatusBar = False
    iWorkbookName = ActiveWindow.Caption

    'Здесь изменение в строке заголовка

    Application.Caption = Empty
    ActiveWindow.Caption = iWorkbookName ' (a).

    Application.Caption = Empty
    ActiveWindow.Caption = ThisWorkbook.Name 'ActiveWorkbook.Name ' (б).
    Если существует вероятность, что строка состояния скрыта, то :
    With Application
         .DisplayStatusBar = True
         .StatusBar = "Строка состояния"
    End With

  • Ответ :
  • Private Sub MyStatusBar()
        Dim iTarget As Range, iCell As Range
        Set iTarget = ThisWorkbook.Worksheets(1).UsedRange '.Range("A1:A50")

        With Application
             iProcent# = 100 / iTarget.Count
             For Each iCell In iTarget
                 iCount& = iCount& + 1
                 .StatusBar = "Выполнено : " & _
                 .Round(iCount& * iProcent#, 0) & "%"
             Next
             .StatusBar = False
        End With
    End Sub
    Private Sub MyStatusBar2()
        With ThisWorkbook.Worksheets(1).Range("A1:A10000")
             'Используйте свой диапазон, содержащий не менее 100 ячеек
             iProcent& = .Count / 100
             Dim iCell As Range '''''
             For Each iCell In .Cells
                 iCount& = iCount& + 1
                 Application.StatusBar = "Выполнено : " & _
                 iCount& \ iProcent& & "%"
             Next
        End With
        Application.StatusBar = False
    End Sub

  • Ответ :
  • iData = InputBox(Prompt:="Введите данные", Title:="http://www.msoffice.nm.ru")
    Комментарий : по своей сути InputBox является функцией.
    Совет : С помощью именованного аргумента Default можно задать текст по умолчанию, а с помощью аргументов XPos, YPos можно управлять размещением диалогового окна на экране, см. ниже пример ...
    iData = InputBox(Prompt:="Введите данные", Title:="", Default:="Просто текст", XPos:=250, YPos:=250)

  • Ответ :

    Вариант I. Для того, чтобы отобразить диалоговое окно, позволяющее ввести необходимое число, можно воспользоваться вышеупомянутой функцией InputBox и функцией Val
  • iData = Val(InputBox(Prompt:="Введите число", Title:=""))
    Комментарий : Используя подобную конструкцию имейте ввиду, что после отказа от ввода, т.е. нажатии кнопки Отмена или Закрыть [X], Вы получите 0, кроме того, в качестве разделителя целой и дробной части числа, необходимо использовать только точку .

    Если же возникнет необходимость в отказе от ввода, или при ввода числа необходимо будет использовать более привычный разделитель, а именно запятую , то в таком случае :
    iData = InputBox("Введите число", "")
    
    If iData <> "" Then
       iData = Val(Application.Substitute(iData, ",", "."))
       'iData = Val(Replace(iData, ",", ".")) 'XL2000
       MsgBox "Вы ввели число : " & iData, , ""
    Else
       MsgBox "Вы отказались от ввода [не]нужного числа", , ""
    End If
    Вариант II. Можно также использовать метод InputBox об'екта Application
    Dim iResult As Double
    iResult = Application.InputBox(Prompt:="Введите число", Title:="", Type:=1)
    Комментарий :
  • Используя этот метод Вы сможете не только ввести необходимое число, но и указать (т.е. ввести вручную или выбрать с помощью мышки) в качестве источника данных ячейку или диапазон ячеек (правда в этом случае в вычислении будут участвовать данные только первой ячейки) Кроме того, Вы можете вводить и более сложные формулы (возвращающие число или текст, который может быть преобразован), к примеру, =12 ="12" =5+7 =A1*1,25 =ПИ() =СУММ(A:A) =ЕСЛИ(МЕСЯЦ(СЕГОДНЯ())=5;A1;B1) =Имя_Ячейки =Имя_Формулы и т.п.
  • К сожалению, разработчики разрешили и ввод даты, поэтому, после ввода, например, 1.1.1900 или 1/1/1900 Вы получите 1, а после ввода 1.1.2009 или 1/1/2009 Вы получите, соответственно, 39814 (подробнее о датах в Excel)
  • После нажатии кнопки Отмена или Закрыть [X], Вы получите 0, но этого можно избежать, если заменить Double на Variant, и просто проверить не возвращает ли функция False (см. ниже)
  • Dim iResult 'As Variant
    
    iResult = Application.InputBox(Type:=1, Title:="", _
    Prompt:="Введите число или формулу", Default:="=(2+2)*2")
    
    If Not iResult Then
       MsgBox "Вы получили : " & iResult, , ""
    Else
       MsgBox "Вы отказались от ввода", , ""
    End If

  • Ответ :

    Если при вызове функции InputBox, Вам необходимо отследить нажатия кнопок в диалоговом окне, т.е. определить, была ли нажата кнопка ОК в т.ч. и с пустым полем, или пользователь действительно кликнул кнопку Отмена или Закрыть [X], то :

    Вариант I.
  • Dim iResult As String
        
    iResult = InputBox( _
    Prompt:="Введите необходимый текст", Title:="Моя программа")
     
    If VBA.StrPtr(iResult) <> 0 Then
       MsgBox "Пользователь нажал кнопку Ok", , ""
    Else
       MsgBox "Пользователь нажал кнопку Отмена/Закрыть", , ""
    End If
    Если же Вас интересует состояние текстового поля, проще говоря, заполнен или нет Edit, то :
    Dim iResult As String
        
    iResult = InputBox( _
    Prompt:="Введите необходимый текст", Title:="Моя программа")
     
    If VBA.StrPtr(iResult) = 0 Then
       MsgBox "Пользователь нажал кнопку Отмена/Закрыть"
    Else
       If iResult = "" Then 'If Len(iResult) = 0 Then
          MsgBox "Пользователь ничего не ввёл, однако нажал кнопку Ok"
       Else
          MsgBox "Нажали кнопку Ok , предварительно заполнив : " & iResult
       End If
    End If
    Вариант II. Решить поставленную задачу также можно с помощью метода .InputBox об'екта Application (один пример см. выше, остальные далее)
    Dim iResult 'As Variant
        
    iResult = Application.InputBox(Type:=2, _
    Prompt:="Введите необходимый текст", Title:="Моя программа")
        
    If iResult = False Then
       MsgBox "Пользователь нажал кнопку Отмена/Закрыть"
    Else
       If iResult = "" Then 'If Len(iResult) = 0
          MsgBox "Пользователь ничего не ввёл и нажал кнопку Ok"
       Else
          MsgBox "Пользователь ввёл : " & iResult
       End If
    End If
    Dim iResult As Variant
        
    iResult = Application.InputBox(Type:=2, _
    Prompt:="Введите необходимый текст", Title:="Моя программа")
        
    Select Case iResult
        Case False
           MsgBox "Пользователь нажал кнопку Отмена/Закрыть"
        Case ""
           MsgBox "Пользователь ничего не ввёл и нажал кнопку Ok"
        Case Else
           MsgBox "Пользователь ввёл : " & iResult
    End Select

  • Ответ :
  • Application.Dialogs(xlDialogPrint).Show
    Application.Dialogs(xlDialogDefineStyle).Show
    Application.Dialogs(xlDialogWorkbookName).Show
    С помощью необязательных аргументов метода .Show можно управлять стандартным диалоговым окном :
    Application.Dialogs(xlDialogPrint).Show Arg1:=2, Arg2:=5, Arg3:=10, Arg4:=3
    Также возможно "отловить" нажатие кнопок Отмена или Закрыть [X]
    iOpenFile = Application.Dialogs(xlDialogOpen).Show _
                (Arg1:="C:\Sample\", Arg2:=False)

    If iOpenFile = True Then
       MsgBox "Вы открыли " & ActiveWorkbook.Name
    Else
       MsgBox "Вы не открыли нужную рабочую книгу"
    End If
    Тот же вариант, только без использования переменной
    If Application.Dialogs(xlDialogOpen).Show("*.xls", False) = True Then
       MsgBox "Вы открыли " & ActiveWorkbook.Name
    Else
       MsgBox "Вы отказались от открытия необходимой книги"
    End If
    Стандартные диалоговые окна [Microsoft Excel 97, 2000] Скачать Скачать
  • Ответ :

    Вариант I. Разместите в любом стандартном модуле нужной рабочей книги :
  • Private Sub Auto_Open()
        Application.OnKey Key:="+^%{F1}", Procedure:="MessageBox"
        ' Сочетание клавиш SHIFT + CTRL + ALT + F1
    End Sub

    Private Sub MessageBox()
        MsgBox "Здесь могла быть Ваша реклама ..."
    End Sub
    или :
    Private Sub Auto_Open()
        Application.OnKey Key:="^c", Procedure:="NewName"
        ' Сочетание клавиш CTRL + C (c)
    End Sub

    Private Sub NewName()
        Application.Dialogs(xlDialogWorkbookName).Show
    End Sub
    Вернуть всё обратно можно выполнив единственную инструкцию :
    Application.OnKey Key:="^c"
    А вот так можно заблокировать выполнение операции, связанной с нажатием стандартных горячих клавиш :
    Application.OnKey Key:="^c", Procedure:=""
    Вариант II. Если Вас устроит сочетание таких клавиш, как CTRL + r или CTRL + SHIFT + R, то создать горячие клавиши для макроса можно и вручную. Для этого, при записи макроса в стандартном диалоговом окне Запись макроса в поле, которое размещено под надписью Сочетание клавиш: необходимо ввести нужную букву.

    Программно это может выглядить так :
    Sub Auto_Open()
        Application.MacroOptions Macro:="Printers", _
        HasShortcutKey:=True, ShortcutKey:="Q"
        ' Сочетание клавиш CTRL + SHIFT + Q (q)
    End Sub

    Sub Printers()
        Application.Dialogs(xlDialogPrinterSetup).Show
    End Sub

  • Ответ :
    Вы можете использовать инструкцию SendKeys или метод .SendKeys об'екта Application, например :
  • SendKeys "{ENTER 10}"
    SendKeys "{F5}"
    SendKeys "^{f}"
    SendKeys "%{F4}"
    SendKeys "А вот и результат{ENTER}" 'RUS KeyBoard
    Application.SendKeys "{ENTER 10}"
    Application.SendKeys "{F5}"
    Application.SendKeys "^{f}"
    Application.SendKeys "%{F4}"
    Application.SendKeys "А вот и результат{ENTER}" 'RUS KeyBoard

  • Ответ :
  • On Error Resume Next

    Dim iData As New DataObject, iText$ 'MSForms.DataObject

    iData.GetFromClipboard
    iText$ = iData.GetText(1)
    If Application.ClipboardFormats(1) = xlClipboardFormatText Then
       With New MSForms.DataObject
            .GetFromClipboard: iText$ = .GetText(1)
       End With
       MsgBox iText$
    End If

  • Ответ :
  • Dim iData As New DataObject, iText$ 'MSForms.DataObject

    iText$ = "Скопировать в буфер обмена"
    iData.SetText iText$, 1
    iData.PutInClipboard
    With New DataObject
         .SetText "Заменить данные на этот текст"
         .PutInClipboard
    End With

  • Ответ :

    Для того, чтобы программно определить пустой или нет буфер обмена, можно, конечно же, найти кнопку Вставить и если оная окажется заблокированной, то и буфер обмена будет, соответственно, пуст. Но можно использовать и свойство ClipboardFormats об'екта Application
  • If Application.ClipboardFormats(1) = -1 Then
       MsgBox "Буфер обмена пуст"
    Else
       MsgBox "Можно использовать вставку"
    End If

  • Ответ : Актуально только для MS Excel 2000
  • Private Sub Office_ClipBoard()
    With Application
         If Val(.Version) = 9 Then
            With .CommandBars("ClipBoard").Controls(4)
                 If .Enabled = True Then .Execute
            End With
         Else
           MsgBox "Пример только для MS Excel 2000"
         End If
    End With
    End Sub

  • Ответ : Скачать пример
  • Select Case Val(Application.Version)
        Case 7:    iVersion = "Microsoft Excel 95"
        Case 8:    iVersion = "Microsoft Excel 97"
        Case 9:    iVersion = "Microsoft Excel 2000"
        Case 10:   iVersion = "Microsoft Excel XP"
        Case 11:   iVersion = "Microsoft Excel 2003"
        Case 12:   iVersion = "Microsoft Excel 2007"
        Case 14:   iVersion = "Microsoft Excel 2010"
        Case 15:   iVersion = "Microsoft Excel 2013"
        Case Else: iVersion = "Неизвестно ..."
    End Select
    MsgBox "Работа идёт в " & iVersion

  • Ответ :
  • Application.ActivateMicrosoftApp xlMicrosoftWord
    Комментарий : Если в момент выполнения этой инструкции Word уже будет запущен, то вместо запуска нового приложения, будет активировано уже имеющееся приложение.
  • Ответ :

    Вариант I.
  • Application.ActivateMicrosoftApp 0
    Вариант II.
    Shell "Calc.exe", vbNormalFocus
    Комментарий : Если в момент выполнения инструкции из первого варианта калькулятор уже будет запущен, то вместо запуска нового калькулятора, будет активирован уже запущенный.
    Воспроизведение любых опубликованных здесь материалов возможно только с письменного разрешения автора : Microsoft Excel 95, 97, 2000, XP

    © 2004-2016 Климов П.Ю. Все права защищены. WebDesign & Error's Klimoff