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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 2)

Модерирует : ShIvADeSt

ShIvADeSt (11-01-2010 10:17): http://forum.ru-board.com/topic.cgi?forum=33&topic=10903  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

   

ShIvADeSt



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

 
 
Обсуждаем вопросы только по Excel VBA
(программирование макросов, скриптов, пользовательских функций и т.п.).
Приветствуются ссылки на ресурсы и справочную литературу по теме.
 
Вопросы по работе с MS Excel, не относящиеся к программированию, задаем в теме Excel FAQ

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Предыдущие ветки топика: Часть 1
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format (eng.)
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами 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.
  • Приемы, хитрости, трюки и нюансы работы в Microsoft Excel - сайт "Планета Excel", целиком посвященный Excel и всему, что с ним связано.
  • Microsoft Excel: Таблицы и VBA. Справочник. Вопросы и Ответы. Советы. Примеры.  
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2, часть 3
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов
    Найти "чужое" окно и нажать в нем кнопку (вписать текст в текстовое поле)
    Работа с UNICODE-символами в VBA: запись, чтение из ячейки, перевод в ASС и обратно
    Как программно подключить дополнительные библиотеки (например, "Microsoft Scripting Runtime" или "Microsoft ActiveX Data Objects 2.8 Library) через References

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:58 23-04-2007 | Исправлено: JekG, 22:32 10-01-2010
    golyshkin



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Приветствую всех в этом форуме!
     
    У меня необычная проблема, которая как раз под стать знатокам Exel:
     
    Есть Google Exel sheet, он совместим с нормальным Exel, но имеет ограничения:  в частности, не имеет VBA. Но зато есть формулы и их можно использовать на 100%. Вопрос в том как с помощью Exel встроенных формул сделать такое условие:
     
    1. Если A1 >= 0, то цвет фона этой ячейки зеленый
    2. Если A1 < 0, то цвет фона этой ячейки красный
     
    Очень бы хотелось услышать варианты решения этой проблемы, а то бъюсь уже 2 дня (Кстати, решение через Conditional Formatting не прокатит, там нет этого option 8-( )

    Всего записей: 47 | Зарегистр. 21-02-2006 | Отправлено: 23:39 06-09-2007
    CMD



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Может уже было... Как проверить нажата ли определенная клавиша?

    Всего записей: 311 | Зарегистр. 18-05-2004 | Отправлено: 09:34 07-09-2007
    nick7inc



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

    Цитата:
    как с помощью Exel встроенных формул сделать такое условие:  
     
    1. Если A1 >= 0, то цвет фона этой ячейки зеленый  
    2. Если A1 < 0, то цвет фона этой ячейки красный

    В родном Excel есть такая штука, как условное форматирование.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 11:03 07-09-2007
    Olive77

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    CMD
    Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    If GetAsyncKeyState(vbKeyF8) < 0 Then
     
    ... etc

    Всего записей: 1271 | Зарегистр. 26-12-2002 | Отправлено: 11:09 07-09-2007
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Olive77
    Чтобы нажать кнопку надо как-то управлять событиями окон. Как это делается через VBA я точно не знаю. Но знаю, что есть интересная штука фирмы InqSoft, называется Sign 0f Misery. Там на псевдоязыке можно сделать програмку, которая ищет окно по какому-то признаку, находит кнопку и посылает ей команду "нажать". Можно там поучиться основам обработки событий, а потом найти где-то в сети описание для VBA или сделать немного иначе: написать на мистерии свою програмку по поиску окна и нажатию кнопки, скомпилировать в EXE и из VBA этот файл запускать. Довольно мороченный способ, но вполне реализуемый.
     
    Добавлено:
    Olive77

    Цитата:
    Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

     
    Не работает. Что-то пропущено или неправильно.
     
    Добавлено:
    Всё, нашёл в чём дело, Public не везде можно использовать.
     
    Добавлено:
    Olive77
    Поиск окна при помощи WinAPI Советую обратить внимание на GetLastActivePopup на этом же сайте.
    Вот здесь написано что-то про отправку сообщений (не вчитывался).
     
    Добавлено:
    Ещё поиск окна (?)

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 11:10 07-09-2007 | Исправлено: nick7inc, 11:53 07-09-2007
    Troitsky



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Olive77
    Если окно создано в VB, то код приблизительно такой:
    Код:
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    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 BM_CLICK = &HF5
     
    Sub BtnClick()
      Dim lhwnd As Long
      Dim sClassName As String
      Dim sCaption As String
       
      sClassName = "ThunderRT6FormDC" ' класс окна
      sCaption = "MyDialog" ' заголовок окна
      ' Находим нужное окно
      lhwnd = FindWindowEx(0, 0, sClassName, sCaption)
      sClassName = "ThunderRT6CommandButton" ' класс кнопки
      sCaption = "OK" ' заголовок кнопки
      ' Находим нужную кнопку в найденном окне
      lhwnd = FindWindowEx(lhwnd, 0, sClassName, sCaption)
      ' Посылаем кнопке событие BM_CLICK
      SendMessage lhwnd, BM_CLICK, 0, 0
    End Sub

    В противном случае классы окон будут другими. Уточнить классы можно, например, с помощью Spy++, которая входит в Microsoft Visual Studio Tools.


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 13:05 07-09-2007 | Исправлено: Troitsky, 13:09 07-09-2007
    InsomniaVK



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброе время суток.
    Ситуация следущая:
    Есть макрос который при запуске выполняет некоторые преобразования с определённым листом из книги отправлеят этот лист на печать, сохраняет и закрывает файл. Всё замечательно, жмёшь открыть файл->выпонить макрос - всё работает. НО таких файлов в папке не один десяток, и даже иногда не одна сотня(((
    Вопрос: как всё это автоматизировать?
    Проблема в том что в выше описанном макросе везде используется ActiveWorkbook, так как имена файлов заранее неизвестны.
    И я в том случае не понимаю как задать переменную - ведь это каждый раз разный файл, и как задать массив из файлов в директории, используя цикл:  
    For Each переменная In массив
    Next
    ???

    Всего записей: 2 | Зарегистр. 07-09-2007 | Отправлено: 13:57 07-09-2007
    Troitsky



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

    Цитата:
    Может уже было... Как проверить нажата ли определенная клавиша?

    Смотря где нажата. Если на пользовательской форме или на одном из ее элементов, то использовать всякие KeyDown, KeyPress, KeyUp (исходя из целей). Если нажатие нужно отловить вне формы, то, видимо, нужно ставить хук.
     
     
    Добавлено:
    InsomniaVK

    Цитата:
    каждый раз разный файл, и как задать массив из файлов в директории

    Ну, если все эти файлы, работу над которыми предстоит проделать, находятся в одной дирректории, то проще, наверное, будет в цикле использовать VB функцию Dir.
     
    выдержка из справки:
    Цитата:
    Синтаксис
     
    Dir[(путь[, атрибуты])]
     
    <...>
     
    Дополнительные сведения
     
    Функция Dir поддерживает использование подстановочных знаков для нескольких символов (*) и для одиночного символа (?) для указания нескольких файлов.
    При первом вызове функции Dir необходимо указать путь, в противном случае возникает ошибка.  Если указаны атрибуты файла, наличие аргумента путь является обязательным.
     
    Функция Dir возвращает первое имя файла, имя которого удовлетворяет аргументу путь.  Для получения остальных файлов, имена которых удовлетворяют указанному пути, следует повторно вызвать функцию Dir без аргументов.  Если файлов, имена которых удовлетворяют указанному пути, не осталось, возвращается пустая строка ("").



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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 14:04 07-09-2007 | Исправлено: Troitsky, 14:10 07-09-2007
    InsomniaVK



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Да, со всеми файлами в директории нужно проделать одно и тоже, и все эти файлы в одной директории.
    тоесть это будет выглядеть например так?:
     
    For Each Dir("D:\111") In ***
     
    ' действия с файлом
     
    Next Dir
     
    тогда как определить массив ***??
    или Dir это и есть массив?? хотя у Вас написано:

    Цитата:
    Функция Dir возвращает первое имя файла

    пробовал:
     
    Folder = Dir("D:\111")
     
    For Each File In Folder
     
    ' действия с файлом
     
    Next File
     
    Выдаёт ошибку 13
    Или лучше использовать другой цикл, то какой?

    Всего записей: 2 | Зарегистр. 07-09-2007 | Отправлено: 14:34 07-09-2007 | Исправлено: InsomniaVK, 15:09 07-09-2007
    Olive77

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc
    Troitsky
    спасибо за подсказки. попробую.
     
    Troitsky

    Цитата:
    Если окно создано в VB, то код приблизительно такой:

    черт его знает в чем он создан, только начал копать, но не похоже, что в VB.
     
     
    InsomniaVK
    н-р,
     
    Name1 = Dir(strPath & "*.xls")
    Do While Name1 <> ""
     
    Loop
     
    etc...
     
     

    Цитата:
    Цитата:как с помощью Exel встроенных формул сделать такое условие:    
    1. Если A1 >= 0, то цвет фона этой ячейки зеленый  
    2. Если A1 < 0, то цвет фона этой ячейки красный  
     
    В родном Excel есть такая штука, как условное форматирование.

     
    при условии, что условного форматирования нет (conditional formatting), можно, я думаю, отформатировать через
    Format->Cells->Numbers->UDF (user-defined)
     
    C Exelем опыта никакого нет

    Всего записей: 1271 | Зарегистр. 26-12-2002 | Отправлено: 15:06 07-09-2007 | Исправлено: Olive77, 15:17 07-09-2007
    genter

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

    Цитата:
    Workbooks.Open Filename:=ThisWorkbook.Path & "/" & "test.xls", notify:=False  
    пойдет?  

     
    Я так уже пробовал - не пойдет, потому как в этом случае пользователь все равно получает сообщение, что файл зарезервирован пользователем.... Открыть для чтения/Отмена.  
    Ладно спасибо, я уже понял, что эту задачу надо решать не в Excel, а хотя бы в Access, где встроен счетчик. Для каждой задачи надо применять свое - универсального продукта не существует.

    Всего записей: 3 | Зарегистр. 05-09-2007 | Отправлено: 15:28 07-09-2007
    Olive77

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    genter
    ну, а почему бы тебе сначала не определить, открыт файл или нет

    Код:
     
    Function IsFileOpen(filename As String) As Boolean
        Dim filenum As Integer, errnum As Integer
     
        On Error Resume Next   ' Turn error checking off.
        filenum = FreeFile()   ' Get a free file number.
        ' Attempt to open the file and lock it.
        Open filename For Input Lock Read As #filenum
        Close filenum          ' Close the file.
        errnum = Err           ' Save the error number that occurred.
        On Error GoTo 0        ' Turn error checking back on.
     
        ' Check to see which error occurred.
        Select Case errnum
     
            ' No error occurred.
            ' File is NOT already open by another user.
            Case 0
             IsFileOpen = False
     
            ' Error number for "Permission Denied."
            ' File is already opened by another user.
            Case 70
                IsFileOpen = True
     
            ' Another error occurred.
            Case Else
                Error errnum
        End Select
     
    End Function
     

     
    и затем уже что-нибудь вроде
    If IsFileOpen(ThisWorkbook.Path & "/" & "test.xls") = True Then
           Workbooks.Open filename:=ThisWorkbook.Path & "/" & "test.xls", ReadOnly:=True
    Else
           Workbooks.Open filename:=ThisWorkbook.Path & "/" & "test.xls"
    End If

    Всего записей: 1271 | Зарегистр. 26-12-2002 | Отправлено: 15:52 07-09-2007 | Исправлено: Olive77, 17:10 07-09-2007
    nick7inc



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

    Цитата:
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ...

    Спасибо за код. Нужная вещь
     
    Добавлено:
    Troitsky

    Цитата:
    Уточнить классы можно, например, с помощью Spy++, которая входит в Microsoft Visual Studio Tools.

     
    Совсем не обязательно ставить Microsoft Visual Studio Tools для этой цели. Подойдёт бесплатная програмка InqSoft Window Scanner (Ссылка). Там, кстати, можно попробовать поотправлять разные сообщения для всевозможных интерфейсных элементов.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 13:34 08-09-2007 | Исправлено: nick7inc, 13:35 08-09-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    хотя здесь эта тема неоднократно поднималась, всё равно, думаю, информация будет полезна. Поэтому позволю себе украсть чужой пост Pavel55 с форума forum.developing.ru
    цитирую

    Вот этой теме (в середине) товарищ KL (XL) (Microsoft MVP) описывает плюсы и минусы разных методик нахождения последней строки:
    http://www.sql.ru/forum/actualthread.aspx?tid=463148#4535898

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 14:45 08-09-2007
    YFred



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Помогите разобраться
    Надо написать макрос:
     На первом листе находится таблица с номерами телефонов во втором столбще, на второй таблица с номерами  в первом столбце и их владельцами во второй. Надо надо определить кому какой телефон пренадлежит и впихнуть на первую страницу имя владельца в 5-ый столбец.
    Вот код, не пойму почему не работает (цикл выполняется только один раз)

    Код:
    Sub Поиск()
    Dim FoneFindSp, Fone As Range
     
    Set Fone = Worksheets(1).Columns(2)
    Set FoneFindSp = Worksheets(2).Columns(1)
     
    For Each FoneCell In Fone
        Set FoneSp = FoneFindSp.Find(FoneCell.Value)
        If Not FoneSp Is Nothing Then
           FoneCell.Offset(0, 5).Value = FoneSp.Offset(0, 1).Value
        End If
    Next FoneCell
    MsgBox ("Конец")
    End Sub

    Всего записей: 210 | Зарегистр. 03-03-2005 | Отправлено: 14:02 10-09-2007 | Исправлено: YFred, 14:04 10-09-2007
    Olive77

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YFred
    Set Fone = Worksheets(1).Columns(2).Cells

    Всего записей: 1271 | Зарегистр. 26-12-2002 | Отправлено: 15:22 10-09-2007
    YFred



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Olive77
    Теперь в цикле обходит ячейки, но командой Find не чего не находит

    Всего записей: 210 | Зарегистр. 03-03-2005 | Отправлено: 15:35 10-09-2007
    nick7inc



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

    Цитата:
    For Each FoneCell In Fone
    идёт обработка всех ячеек обоих столбцов, непонятно зачем...
    Добавлено:
    Надо добавить:

    Код:
    Dim FoneCell as Range

    и исправить

    Код:
    Set Fone = Worksheets(1).Range("A1:B65535")

     
    Добавлено:
    Пока писал уже лучше ответили.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 15:38 10-09-2007 | Исправлено: nick7inc, 15:45 10-09-2007
    YFred



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    nick7inc и Olive77
     
    Может еще чо подскажите???? В чем ошибка?

    Всего записей: 210 | Зарегистр. 03-03-2005 | Отправлено: 16:11 10-09-2007
    ol7ca

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

    Цитата:
    Имеем файл А - куда должны попасть даные из файлов В и С. Важно чтобы были вставлены только значения  без формул а итоговые (последняя строка снизу и последний столбец справа) остались с формулами. спасибо.  

     
    кто-нибудь может мне помочь с написанием скрипта?

    Всего записей: 125 | Зарегистр. 01-02-2007 | Отправлено: 17:28 10-09-2007
       

    Страницы: 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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 2)
    ShIvADeSt (11-01-2010 10:17): http://forum.ru-board.com/topic.cgi?forum=33&topic=10903


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru