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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 201 202 203 204 205 206 207 208 209 210 211 212 213

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



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

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

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Предыдущие ветки топика: Часть 1, Часть 2
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях 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
     
    Перечень основных ColorIndex'ов из MSDN
     

    Смежные темы:
    Программы » Microsoft Office 2019 & 365 | 2016 | 2013 | 2010 | 2007 | 2003
    Программы » OneNote | Outlook 2013 & 2016 & 2019 | Outlook 2010 | Microsoft Mathematics & Math Solver
    Программы » Word FAQ | Excel FAQ | Access FAQ
    Прикладное программирование » Word VBA | Access VBA  
    Андеграунд » Microsoft Office 2019 | 2016 | 2013 | 2010 | 2007 | 2003
    Андеграунд » OneNote | Visio | SharePoint Server | Project Server | Exchange Server
    Андеграунд » Надстройки (add-ins) и коммерческие макросы Excel
    Андеграунд » Самостоятельная сборка дистрибутивов Оffice 2007/2010/2013/2016 | MUI для Office 2007

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:16 11-01-2010 | Исправлено: ALeXkRU, 16:42 03-08-2021
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Booklet, а как ругается-то? Какое сообщение? На MS Excel 2k3 работает влет просто.

    ----------
    Переработал: втыкая аккумулятор в шуруповерт пытаешься передёрнуть затвор

    Всего записей: 4264 | Зарегистр. 22-06-2002 | Отправлено: 17:27 13-07-2010
    Booklet

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ну... В процессе выполнения что-то там бурчит и предлагает STOP или DEBUG.
    Если DEBUG - на эту строку отправляет.
     
    Пришёл начальник и учит "как правильно делать". Сделал колонку с "сегодня", сделал колонку с 1 или 0 в зависимости от "больше ли дата". Улыбаюсь про себя.

    Всего записей: 741 | Зарегистр. 09-03-2006 | Отправлено: 17:53 13-07-2010
    ZlydenGL



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

    Код:
    Select Case DateDiff("d", Cells(I, 2), Now())
     
    заменить на

    Код:
    Select Case (int(Now()) - int(Cells(I, 2)))

    Конечно, не то же самое и не по-научному, но может на безрыбье и подойдет

    ----------
    Переработал: втыкая аккумулятор в шуруповерт пытаешься передёрнуть затвор

    Всего записей: 4264 | Зарегистр. 22-06-2002 | Отправлено: 18:01 13-07-2010
    Booklet

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

    Код:
        Range("J2").Select
        ActiveCell.FormulaR1C1 = "=TODAY()"
                 
     ' собсна раскраска...
       Cells.FormatConditions.Delete
        Range("A2:G200").Select
        Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$G2<$J$2"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Interior
            .Color = 255
        End With

    ...работает.
    Где у меня что рассказать?
     
    Добавлено:
    Однако, метод неполон. Надо добавить ещё "насколько меньше".
     
    А подскажите кто-нибудь, пожалуйста как выдрать значение ячейки в 2 столбцах слева, если она непустая и добавить в конец текущей, сделав жирненьким и сменив кегль?
     
    Можно ли поудалять лишние символы конца строки? То есть только те, которые последние символы в ячейке.

    Всего записей: 741 | Зарегистр. 09-03-2006 | Отправлено: 11:23 14-07-2010
    ZlydenGL



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

    Код:
       Cells.FormatConditions.Delete
        UsedRange.Select
        Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=and($G2<TODAY();$G2<>"""")"
        'Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Interior
            .Color = 255
        End With
     

    Строчку с SetFirstPriority закомментил, поскольку на моем Office 2k3 она вываливает ошибку. В формулу добавил обработку случаев, когда дата не заполнена (предполагаю, что в таком случае вся строка пустая - а значит раскрашивать незачем), а также забил туда же определение текущей даты. Также добавил обработку всего пользовательского диапазона, а не только первых 199 строк.
     
    Известные косяки:
    1. Не знаю, как под Office 2007, но в Office 2k3 можно использовать только ТРИ условия условного форматирования, т.е. если нужно разделять цветами больше 3х случаев - фокус уже не пройдет
    2. ХЗ почему, но ячейка с датой "13 июля" у меня тоже не закрасилась, хотя она очевидно меньше даты "14 июля" (сегодня).

    ----------
    Переработал: втыкая аккумулятор в шуруповерт пытаешься передёрнуть затвор

    Всего записей: 4264 | Зарегистр. 22-06-2002 | Отправлено: 13:45 14-07-2010
    Booklet

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Увы,
     
    Не проходит.
     
    Добавлено:
    Увы,
     
    Не проходит.
     
    Добавлено:
    Ругается на
     UsedRange.Select
     
     
    Добавлено:
    Вообще лично у меня конструкции типа "$G2<(TODAY()" не проходят - именно из-за этого мне пришлось выносить отдельно TODAY.

    Всего записей: 741 | Зарегистр. 09-03-2006 | Отправлено: 15:23 14-07-2010
    se111



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Столкнулся с такой ситуацией,
    необходимо вставить обьект(файл) word, excel или что либо еще  
    на определенный лист и потом сделать так чтобы вставленный обьект  
    нельзя было изменить.  
     
    вставляю документ так:
     
    Private Sub CommandButton1_Click()
        Worksheets("Document").Activate
        Worksheets("Document").Range("C5").Activate
        ActiveCell.BorderAround
        Dim vFile As Variant
        vFile = Application.GetOpenFilename("All Files,*.*", Title:=" Find file to insert")
        If LCase(vFile) = "false" Then Exit Sub
        ActiveSheet.OLEObjects.Add(Filename:=vFile, Link:=False, _
        DisplayAsIcon:=True, IconFileName:="winword.exe", IconIndex:=0, _
        IconLabel:=holdvar).Select
         
    End Sub
     
    ячейку можно защитить но она(вложенный документ) тогда не открывается вообще.
    а нужно чтобы читать его можно было, а редактировать нет.
    Ни у кого нет идей как такое сделать?
     
     
     
     
    Добавлено:
    если бы можно было как нибудь получить размер(килобайты, мегабайты) вложеннного оьекта, сравнить их и не сохранять например. Но как это
    сделать дотумкать не могу.

    Всего записей: 782 | Зарегистр. 21-04-2005 | Отправлено: 20:13 14-07-2010 | Исправлено: se111, 20:14 14-07-2010
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    se111
    Раз можно открыть, значит можно и изменить.
    Делай копию документа и открывай уже ее. Пусть меняют. По закрытии просто delete копию.

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 21:11 14-07-2010
    se111



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    dneprcomp
    а как это сделать ? я вообще плохо себе представляю как обращаться к внедренному  
    объекту. тем более его копировать.  
    нет каких нибудь примеров?
     

    Всего записей: 782 | Зарегистр. 21-04-2005 | Отправлено: 07:10 15-07-2010
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    se111
    Вот один из возможных сценариев.
    Не внедряй сразу в лист, а просто храни полный путь и имя файла. Можешь даже иконку поставить для наглядности. Для Word-a вордовскую, для Excel - экселевскую и т.д. На клик по иконке делаешь временную копию файла и уже ее открываешь. По закрытию можешь копию убить.
     
    File and Folder Procedures in VBA Visual Basic for Applications  
    Basic file and folder examples using VBA in Microsoft Excel
     
    vba file copy

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 09:12 15-07-2010 | Исправлено: dneprcomp, 09:19 15-07-2010
    Alexikit

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

    Код:
     aaa= App.Path

     
    а в Excel, у меня так не получилось. Выдает ошибку. Может не подключена какая либо библиотека?
     
     
    Добавлено:
    Все спасибо, выкрутилась сама, оказывается есть команда  
     

    Код:
     aaa= ActiveWorkbook.Path  

    Всего записей: 79 | Зарегистр. 01-04-2009 | Отправлено: 08:45 16-07-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alexikit, на всякий случай лучше ссылаться на ThisWorkbook.Path. Например - если нужно получить этот самый путь в тот момент, когда на переднем плане находится другая книга (пользователь случайно переключил или макрос для обработки его открыл - без разницы), то ActiveWorkbook.Path вернет путь к этой самой книге "наверху", а не путь к макрососодержащей книге.

    ----------
    Переработал: втыкая аккумулятор в шуруповерт пытаешься передёрнуть затвор

    Всего записей: 4264 | Зарегистр. 22-06-2002 | Отправлено: 12:22 18-07-2010
    surgutfred



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Спецы, а подскажите плиз такую вещь. Можно как то вызывать определенный макрос в любой книге? А то я понял что в существующей книге надо макрос прописывать. Или из другой книги макросом подгружать и обрабатывать.
    Суть в чем - просто экспортром из сторонней программы получается книга excel, и хотелось бы ее сразу доработать. Т.е. Экспорт - открывается книга, жмем кнопочку макрос он работает.
    ???

    Всего записей: 589 | Зарегистр. 21-08-2001 | Отправлено: 11:28 19-07-2010
    Drazhar

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    surgutfred
    Можно, если прописать этот макрос например в персоналдьную книгу ( personal.xls)
     
    Добавлено:
    Доброе время суток.
    Ни разу не сталкивался  
    Есть задача - сукачать файл с корпоративного портала. Проблема - там стоит какая-то хитрая аутентификация на проксю. Решение с забитыми настройками логин-пароль применять нельзя.  
    пробовал через Set objHttp = CreateObject("MSXML2.ServerXMLHTTP") - н не выдает никак окошка с запросом пароля - хоть ты тресни, хотя при работе через ьбраузер(IE, Chrome - запросы есть).
    Не сталкивался ли кто-нить с подобной задачей?
    Заранее спс

    Всего записей: 88 | Зарегистр. 10-11-2009 | Отправлено: 11:39 19-07-2010
    Alexikit

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

    Всего записей: 79 | Зарегистр. 01-04-2009 | Отправлено: 12:00 19-07-2010
    KolyaP

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть такой метод Find
     
    Например  
    Set a = Worksheets(1).Range("a1:a500").Find(2, lookat:=xlWhole)
     
    При исполнении этого примера сохраняется параметр lookat.
     
    В следующий раз если в ручном режиме вызвать команду "Найти", будет установлен флажок "Ячейка целиком".
    Есть ли способ прочитать этот параметр (lookat) и установить его желательно не вызывая метод Find?

    Всего записей: 43 | Зарегистр. 04-01-2009 | Отправлено: 14:31 21-07-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KolyaP, можно задачу поиска "вынести" в переменную xls as Excel.Application, в этом случае ИМХО настройки поиска для текущего приложения не собьются. Правда это сразу означает общее замедление работы макроса (поскольку общение с переменной через COM пойдет).

    ----------
    Переработал: втыкая аккумулятор в шуруповерт пытаешься передёрнуть затвор

    Всего записей: 4264 | Зарегистр. 22-06-2002 | Отправлено: 15:24 21-07-2010
    KolyaP

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ZlydenGL
     
    Прошу прощения. Можно поподробнее?
    Ничего не понял. Как это делается?
     
    А можно непосредственно читать и устанавливать эту переменную(lookat)?

    Всего записей: 43 | Зарегистр. 04-01-2009 | Отправлено: 16:13 21-07-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KolyaP, может быть и можно, да только я пока такого способа не нашел.
     
    А делается предложенное мной так (на примере поиска файла в другой книге):

    Код:
    Dim xls As Excel.Application, FindRes as Range
    Set xls = CreateObject("Excel.Application")
    ' Открываем нужную книгу, в которой будем производить поиск, в режиме "только чтение" - чтоб не мешать другим процессам. Если по результатам поиска надо что-то исправлять в той же самой книге - последний False убираем
    xls.Workbooks.Open FileName, False, False
    ' В этой книге на первом попавшемся листе ищем то, что нам надо
    Set FindRes = xls.ActiveSheet.Cells.Find(FindString, lookat:=xlWhole)
    ' Дальше что-то делаем с найденышем
    ...
    ' Закрываем открытую книгу БЕЗ сохранения (если нужно сохранение, вместо False пишем True)
    xls.ActiveWorkbook.Close False
    ' Закрываем переменную и освобождаем память
    xls.Quit
    Set xls = Nothing

     
    Известные проблемы такого подхода:
    1. Все операции обработки выполняются ощутимо медленнее (еще бы - фактически при этом открывается ЕЩЕ ОДНО приложение MS Excel, с которым идет обмен данными по COM интерфейсу)
    2. Если вдруг код в середине процедуры/функции "вылетит", то без обработки ошибок вновь открытый процесс MS Excel так и останется висеть в памяти. Можно обойти таким способом:

    Код:
    Sub My()
    Dim xls As Excel.Application, FindRes as Range
    Set xls = CreateObject("Excel.Application")
    On Error Goto Err_Handler
    ' Здесь идет рабочее тело процедуры
    ....
    xls.Quit
    Set xls = Nothing
    Exit Sub
    Err_Handler:
    ' Здесь делаем какой-нить обработчик ошибок - самым тупым будет на момент отладки поставить Resume с постановкой брейкпоинта на него
    xls.Quit
    Set xls = Nothing
    End Sub


    ----------
    Переработал: втыкая аккумулятор в шуруповерт пытаешься передёрнуть затвор

    Всего записей: 4264 | Зарегистр. 22-06-2002 | Отправлено: 10:27 22-07-2010 | Исправлено: ZlydenGL, 10:31 22-07-2010
    KolyaP

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ZlydenGL
    Спасибо!
    Попробую ради интереса, но как Вы верно заметили, врядли это разумно с практической точки зрения.
     
    Насчет lookat, все обыскал, нигде не нашел способа ее чтения и независимой установки от процедуры Find. Скорее всего в Microsoft не предусмотрели никаких способов это сделать. Наверное это невозможно.

    Всего записей: 43 | Зарегистр. 04-01-2009 | Отправлено: 11:19 22-07-2010
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 201 202 203 204 205 206 207 208 209 210 211 212 213

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 3)


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru