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

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



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

    Цитата:
    Как проверить запущен указанный EXE или нет и сказать об этом макросу VBA?

    Если я не ошибаюсь, то VBA позволяет испорльзовать стандлартные АПИ функции, надо только их описать в макросе и все. А код для определения запущенного процесса на АПИ в форуме уже не раз обсуждался, надо только фильтр использовать.

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

    Юзай АПИ и не будет никаких проблем, сможешь получать инфу из практически любых окон, с которых можно получить инфу.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:01 03-08-2005
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igbt
    Я же привел код. Добавь в модуль и пробуй. Поставь на форму кнопку и вызывай CheckWindow .

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 03:24 03-08-2005
    evle



    1 + int rand(100);
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_krimson
    В свойстве Formula не должно быть русских названий функций (СУММ). Для этого используй FormulaLocal, А лучше английские названия.

    ----------
    For every complex problem, there is a solution that is simple, neat, and wrong.

    Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 07:14 03-08-2005
    igbt

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dneprcomp
    Работает, спасибо.
     
    Теперь другой вопрос: как закрыть указанное окно.
    Пытался через DestroyWindow и через CloseWindow, но они возвращают False и True соответственно, а окно не закрывают.
    Вот код:
     
    Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Boolean
    Declare Function CloseWindow Lib "user32" (ByVal hwnd As Long) As Boolean
    Sub tt()
     
    Dim qqq As Long
    Dim Index As Boolean
    qqq = ' идентификатор окна
    Index = CloseWindow(qqq)
    'Index = DestroyWindow(qqq)
     
    End Sub
     

    Всего записей: 51 | Зарегистр. 17-02-2005 | Отправлено: 14:04 05-08-2005
    epsilon



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

    Цитата:
    Windows("file.xls").Activate
    ActiveWindow.Close

    Удачи!

    Всего записей: 72 | Зарегистр. 25-02-2003 | Отправлено: 21:42 08-08-2005
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igbt
    А чему равно qqq ?
    Его не надо об'являть, т.к при об'явлении qqq = 0.  
    Используй TargetHwnd из моего примера.

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 01:17 09-08-2005 | Исправлено: dneprcomp, 01:21 09-08-2005
    igbt

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

    Код:
     
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal Class As String, ByVal WN As String) As Long
    Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Boolean
     
    Dim qqq As Long  
    Dim Index As Boolean
     
    Sub tt()  
       
      qqq = FindWindow(vbNullString, "Calculator")
      Index = DestroyWindow(qqq)  
     
    End Sub
     

     
    qqq - какое-то число, я так понял это и есть идентификатор окна, потому как
    в описании FindWindow так и написано.
     
    И вот так Index=False и окно соответственно не закрывается.
    Когда вместо DestroyWindow ставлю CloseWindow, Index=True,
    но в этот момент окно и так свернуто.
    Чего делать не знаю....
    Это такое ГОРЕ !!!! :о|

    Всего записей: 51 | Зарегистр. 17-02-2005 | Отправлено: 13:08 09-08-2005
    KChernov



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ветки просто про VBA нету, так что пишу сюда.
     
    Мне надо в макросе взять текст из буфера обмена, обработать и положить обратно.  
    Но тот вариант, который я написал, почему-то ругается при попытке положить текст обратно в буфер (последняя строчка примера).  
    Вот:  
    Dim MyData As DataObject ' это в общем модуле
    Sub ConvertText()
        Dim splitString As Variant
        Dim joinString As String
        Set MyData = New DataObject
        MyData.GetFromClipboard
        splitString = Split(MyData.GetText(1), " ")
        splitString(1) = splitString(1) & " "
        For i = LBound(splitString) + 1 To UBound(splitString)
            splitString(i) = Mid(splitString(i), 1, 1) & "."
        Next
        joinString = Join(splitString)
        MyData.SetText joinString
        MyData.PutInClipboard
    End Sub  
     
    Но вот если в предпоследнюю строчку процедуры вместо переменной поставить константу - все работает?!  
    Мб я как-то неправильно формирую строку для буфера? (msgbox отрабатывает без проблем)?  
     
    Или мб это вообще как-то иначе нужно делать?..

    Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 13:20 09-08-2005 | Исправлено: KChernov, 16:10 09-08-2005
    Tushkanchyk

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем!  
     
    Умные люди, подскажите, пожалуйста, такую вещь:
    наскольно я знаю, в Excel нет встроенных функций, позволяющих выводить прописью число, содержащееся в какой-либо ячейке, например: 10105 - десять тысяч сто пять (рублей).
     
    ЧТО и КАК можно использовать, чтобы это сделать? (VBA, макросы.....)
    Может, уже есть что-то работающее??? Где это можно поискать?
     
    Спасибо заранее!

    Всего записей: 4 | Зарегистр. 09-08-2005 | Отправлено: 13:44 09-08-2005
    igbt

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tushkanchyk
     
    Поищи в сети файлик Propis99.xla
    И будет тебе счастье :о)))

    Всего записей: 51 | Зарегистр. 17-02-2005 | Отправлено: 17:07 09-08-2005
    dneprcomp



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

    Цитата:
    Visual Basic 6 definition
    Declare Function DestroyWindow Lib "user32.dll" (ByVal hWnd As Long) As Long  
     Visual Basic .NET definition
    Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Integer) As Integer
    Description
    DestroyWindow destroys a window. Any menus, timers, or child windows are automatically destroyed along with it. DestroyWindow only works with windows that are owned by the calling program, however. DestroyWindow Destroys the specified window.  
     
    CloseWindow Minimizes (but does not destroy) the specified window.  
     

    Попробуй:  
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
     
    Private Const WM_CLOSE = &H10
    Call SendMessage(hWnd, WM_CLOSE, 0, 0)
    где hWnd = qqq

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 21:04 09-08-2005 | Исправлено: dneprcomp, 21:05 09-08-2005
    igbt

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

    Код:
     
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal Class As String, ByVal WN As String) As Long
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
     
    Call SendMessage(FindWindow(vbNullString, "Calculator"), &H10, 0, 0)
     
     

     
    А не подскажешь код для WM_DESTROY ?
    А то моё приложение задаёт при закрытии много лишних вопросов :о).

    Всего записей: 51 | Зарегистр. 17-02-2005 | Отправлено: 17:35 10-08-2005
    UserOKA

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ, поделитесь примерчиком формы Excel для работы с БД Access.
    Заранее спасибо.

    Всего записей: 149 | Зарегистр. 01-10-2003 | Отправлено: 19:22 10-08-2005
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igbt
    Public Const WM_DESTROY = &H2

    Цитата:
    Call SendMessage(FindWindow(vbNullString, "Calculator"), &H10, 0, 0)  

    Я бы не рекомендовал все же так делать. А что будет, если FindWindow не найдет окна?

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 20:16 10-08-2005 | Исправлено: dneprcomp, 20:18 10-08-2005
    archimed7592

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    всем привет!
    подскажите пожалуйста, как сделать так, чтобы, когда я изменяю какую-либо ячейку, excel не переключался на её страницу(книгу), не обновлял её?
    я нашёл application.interactive, но при ошибке в скрипте excel блокируется окончательно. может быть есть в VBA какой-нибудь аналог try...catch (или try...finally)?
     
    как одной сделать так, чтобы вместо формулы в наборе ячеек (range) поместились их текущие значения?
     
    и последнее: мне нужно открыть файл, но не просто открыть, а чтобы, если он уже открыт, заново его не открывать.
     
    заранее very big thanks

    Всего записей: 159 | Зарегистр. 07-08-2005 | Отправлено: 01:39 11-08-2005
    dneprcomp



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

    Цитата:
    аналог try...catch  

    Посмотри On Error GoTo

    Цитата:
    мне нужно открыть файл, но не просто открыть, а чтобы, если он уже открыт, заново его не открывать
    Посмотри на 8-й странице я приводил код для API
     
     

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 01:46 11-08-2005
    archimed7592

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dneprcomp, big thanks тебе
     
    ещё одна проблемка появилась: без application.interactive=true скрипт работает отлично.
    application.interactive = false - выдаёт "5: Invalid procedure call or argument"
    в чём дело?
    скрипт только пишет данные в ячейки разных листов.

    Всего записей: 159 | Зарегистр. 07-08-2005 | Отправлено: 03:42 11-08-2005
    aquaman1977



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Проблема.
    При использовании функции LookUp если условие не выполняется (т.е. значение, удовлетворяющее условию в указанном диапазоне не найдено) вылетает ошибка 1004..
    Как можно отловить это событие? Чтобы скрипт не прерывался?
     
    Вопрос снимается.
    Решил путем использования On Error Resume Next
     
    Другой вопрос:
    как организовать удаление одинаковых строк на листе?
    На данный момент у меня решение основано на поячеечном сравнении..
    Можно как-нибудь это оптимизировать?

    Всего записей: 94 | Зарегистр. 11-03-2005 | Отправлено: 13:12 11-08-2005 | Исправлено: aquaman1977, 14:44 11-08-2005
    Sleepwalker



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

    Цитата:
    как организовать удаление одинаковых строк на листе?  
    На данный момент у меня решение основано на поячеечном сравнении..

    если количество данных небольшое (ну, например, 1000 строк) то имхо никак.
    Если же достаточно большое, то, по-моему, лучше сначала отсортировать а потом делать 1 сквозной проход (одинаковые ячейки будут рядом находится). Кстати, строки лучше не удалять, а копировать на другой лист, на порядок быстрее получается, нежели удаление. Либо тогда их как-то помечать на удаление, потом выделять и удалять все сразу.

    ----------
    ...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

    Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 15:01 11-08-2005
    Tushkanchyk

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем!  
     
    Умные люди, подскажите, пожалуйста, такую вещь:  
    наскольно я знаю, в Excel нет встроенных функций, позволяющих выводить прописью число, содержащееся в какой-либо ячейке, например: 10105 - десять тысяч сто пять (рублей).  
     
    ЧТО и КАК можно использовать, чтобы это сделать? (VBA, макросы.....)
    Не знаю, с какой стороны к этому подойти!!!  
    Может, уже есть что-то работающее??? Где это можно поискать?  
     
    Спасибо заранее!  

    Всего записей: 4 | Зарегистр. 09-08-2005 | Отправлено: 18:18 11-08-2005
       

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