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

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

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Booklet,
    Чтобы увидеть Toolbar с кнопками (Developer) надо нажать кнопку Office (у меня только анг. версия 2007 есть). Потом нажать кнопку Excel Options, потом Popular и Show Developer tab in the Ribbon.
    Найти Developer таб в меню, потом Insert и тут можно выбрать то что надо (кнопку или что-то другое). Перейти в VBE можно как и раньше (Alt+F11)..
     
    Нашёл и руководство про появление Developer Taba к 2010 версии

    Код:
    http://www.excel-2010.com/the-developer-tab-in-microsoft-excel-2010/


    Всего записей: 386 | Зарегистр. 19-07-2005 | Отправлено: 18:31 09-08-2010
    Booklet

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо, Gyura
     
     
    Добавлено:
    Попробую помучить. Надеюсь, Вы не против.

    Цитата:
    Dim Arr() As String, I As Long, J as Long, K As Byte, WS as Worksheet, Found as boolean, LastRow as Long, LastCol as Byte  

    Не понял предназначения всех переменных. Точнее - понял не всех.

    Цитата:
    LastCol = Cells.SpecialCells(xlLastCell).Column  

    это в переменную пишем номер последней колонки. Он, кстати, по сути своей номер или буква?

    Цитата:
    For I = 1 To Cells.SpecialCells(xlLastCell).Row  
         Arr = Split(Cells(I, 2), ", ")  

    Тэкс... счётчик на I понятен. А во второй строчке что происходит?

    Цитата:
         For J = LBound(Arr) To Ubound(Arr)  
              Found = False  
              For Each WS In ThisWorkbook.Worksheets  
                   If WS.Name = Arr(J) Then  
                        Found = True  

    Совсем не понял.
    Что происходит?

    Цитата:
                        Exit For  
                   End If  
              Next WS  
              If Not Found Then  
                   Set WS = Worksheets.Add  
                   WS.Name = Arr(J)  
              End If  
              LastRow = WS.Cells.SpecialCells(xlLastCell).Row + 1  
              For K = 1 To LastCol  
                   WS.Cells(LastRow, K) = Cells(I, K)  
              Next K  
         Next J  
    Next I

    Опять - не понимаю как оно работает.
     
    Как я вижу механизм работы.
    1. колонка, где искать заранее известна. Поэтому берём и ищем в колонке С уникальные значения, разделённые "; ". Однако, это знак разделения, то есть последнее значение этим знаком не оканчивается.
    2. Создаём новый лист с новым уникальным именем.  
    3. после создания всех новых листов снова проход по колонке С и, если имя листа там присутствует - копируем строчку в тот лист

    Всего записей: 741 | Зарегистр. 09-03-2006 | Отправлено: 12:54 10-08-2010
    timkuptsov

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Запускаю на компе, где стоит только OpenOffice, портативный Excel 2003 (Grizli). При попытке установить какой-либо элемент управления (кнопка или галка и т.п.) пишет, что Microsoft Map больше не поддерживает эти элементы.
    Не подскажите, что необходимо установить, чтобы эта функция заработала?

    Всего записей: 76 | Зарегистр. 16-06-2010 | Отправлено: 00:12 11-08-2010
    Booklet

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

    Код:
       Range("E:E").Select
        ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[2],(IF RC[8]=0,, "" / ""),RC[8])"
        Selection.AutoFill Destination:=Range("E2:E1500"), Type:=xlFillDefault

    подскажите, кто может...
    мне надо каким-то макаром выделенный фрагмент заменить на что-то иное. Надо применять cо второй строки и до последней непустой.

    Всего записей: 741 | Зарегистр. 09-03-2006 | Отправлено: 15:06 11-08-2010
    Gyura

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

    Цитата:
    Цитата:
    Dim Arr() As String, I As Long, J as Long, K As Byte, WS as Worksheet, Found as boolean, LastRow as Long, LastCol as Byte  
     
    Не понял предназначения всех переменных. Точнее - понял не всех.
     

    В этой части происходит декларирование переменных. Вы говорите какого типа будут Ваши переменные.  
    Arr это массив (анг. Array). String, Long, Byte типы  
    Вообще, много можно узнать из самого VBE доводя курсор на типы переменных, свойства, методы и все экселевские ключевые слова (и сам так делаю), а потом вызивая помощь (F1). Ещё много можно узнать из хороших книжек (рекоммендую книжки Уолкенбаха, загляните в ГенЛибРусЕц).
     

    Цитата:
     
    LastCol = Cells.SpecialCells(xlLastCell).Column  
     
    это в переменную пишем номер последней колонки. Он, кстати, по сути своей номер или буква?
     

     
    Он по сути номер. Если Вам это облегчит жизнь, Вам можно в R1C1referenceStyle галочку поставить (OfficeButton/ExcelOptions/Formulas/ в Эксель2007) и Вам всё будет понятно.
     

    Цитата:
     
    Цитата:
    For I = 1 To Cells.SpecialCells(xlLastCell).Row  
         Arr = Split(Cells(I, 2), ", ")  
     
    Тэкс... счётчик на I понятен. А во второй строчке что происходит?
     

    Со Split не знаком. Тут что-то (Split) происходит в массиве (убирает знак ,?) по строчкам. Может кто-то из спецов объяснит
     

    Цитата:
     
    Цитата:
         For J = LBound(Arr) To Ubound(Arr)  
              Found = False  
              For Each WS In ThisWorkbook.Worksheets  
                   If WS.Name = Arr(J) Then  
                        Found = True  
     
    Совсем не понял.
    Что происходит?
     

    Определяется размер массива (LBound, UBound). Потом ищет в каждом Worksheet рабочей тетрадки (Workbook) и если название совпадает переменная становится True.  
     

    Цитата:
     
    Цитата:
                        Exit For  
                   End If  
              Next WS  
              If Not Found Then  
                   Set WS = Worksheets.Add  
                   WS.Name = Arr(J)  
              End If  
              LastRow = WS.Cells.SpecialCells(xlLastCell).Row + 1  
              For K = 1 To LastCol  
                   WS.Cells(LastRow, K) = Cells(I, K)  
              Next K  
         Next J  
    Next I
     
    Опять - не понимаю как оно работает.
     
     
    Это продолжение выше упомянутого цикла. Он проходит через все Листы (worksheets), а если не найдёт то что ищет, добавляет ещё 1 лист (именно тот который искал).
     

    Всего записей: 386 | Зарегистр. 19-07-2005 | Отправлено: 16:17 11-08-2010
    Filosov13

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    На форме есть объекты Label1, Label2, ...  
    Возможно ли для всех их сделать один обработчик события Click?

    Всего записей: 3 | Зарегистр. 04-06-2010 | Отправлено: 17:01 12-08-2010
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Filosov13
    Используй функцию. На Click поставь вызов этой функции с каждого контрола

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 02:29 13-08-2010
    Filosov13

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

     
    Пока я так и сделал. Но в функции всего две строчки. Лаблов 32 шт. В итоге код не очень ... скажем элегантный.

    Всего записей: 3 | Зарегистр. 04-06-2010 | Отправлено: 11:35 13-08-2010
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Filosov13
    Если надо исполнять одинаковый код для всех контролов, то других методов не существует.

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 17:19 13-08-2010
    Pavel745

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго времени суток, подскажите пожалуйста как вставить из модуля листа 1 массив в  лист 2, если просто пишешь диапазон то все нормально в лист 1  и вставляет, а если приписать имя листа 2 то выдает ошибку т.е. в чужой лист почему то массив не хочет вставлять (через For next работает но долго - не вариант), а да из обычного модуля такой фокус проходит а вот из модуля листа почему то нет хотя очень надо именно из листа:
    Sheets(namei).Range(Cells(ri1 + 1, ci4), Cells(ri1 + si, ci4)) = Application.Transpose(massiv)
     
    Добавлено:
    Нашел ответ http://sql.ru/forum/actualthread.aspx?tid=23503
    Порой на такие приколы в екселе нарываешься, почему то ссылку в виде A1 , без проблем воспринимает а вот если R1C1 то надо дописывать к ссылке имя листа.

    Всего записей: 2 | Зарегистр. 15-08-2010 | Отправлено: 12:44 15-08-2010 | Исправлено: Pavel745, 12:49 15-08-2010
    Sergey071

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите пожалуйста разобраться.  
    Написал макрос в EXCEL 2007 с одним модулем и одной формой.  
    Внутри модуля значения переменных нормально передаются,  
    а в форму не передаются, хотя нужные переменные объявил в  
    начале модуля как public.

    Всего записей: 1 | Зарегистр. 15-08-2010 | Отправлено: 16:10 15-08-2010
    SAS888

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

    Цитата:
    если просто пишешь диапазон то все нормально в лист 1  и вставляет, а если приписать имя листа 2 то выдает ошибку

    Ошибку не Excel выдает, а Вы делаете. Строка вашего кода  
    Код:
    Sheets(namei).Range(Cells(ri1 + 1, ci4), Cells(ri1 + si, ci4)) = Application.Transpose(massiv)
    означает, что массив нужно вставить в диапазон листа "namei", а границы диапазона Вы задаете из активного листа. Т.е. ошибки не будет только в том случае, если в момент выполнения кода активен лист "namei". Для того, чтобы избежать ошибки, требуется указывать ссылку на лист при каждом обращении к ячейке, при чем, не зависимо от используемого стиля ссылок. Например, так:

    Код:
    With Sheets(namei)
        .Range(.Cells(ri1 + 1, ci4), .Cells(ri1 + si, ci4)) = Application.Transpose(massiv)
    End With

     
    Добавлено:
    Filosov13
     
    Цитата:
    Возможно ли для всех их сделать один обработчик события Click?

    Создайте модуль класса и в нем пропишите требуемую процедуру. Пример нужен?

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 11:13 17-08-2010 | Исправлено: SAS888, 11:15 17-08-2010
    FEGORA

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    всем привет, у меня такой вопрос:
    есть табличка, в ней ссылки на gif и параметры самих картинок справа
    стоит задача после ручной фильтровки активировать (открыть) отфильтрованные скрины нажатием кнопки (после фильтровки их останется не больше 40)
    написал такой код:
     
     
    Sub открыть()
    Dim x As Integer
    Update_Screen
     If Not ActiveSheet.FilterMode Then MsgBox "Не отфильтровано", vbOKOnl, "Ошибка добавления данных": Exit Sub
          Set Range_From = ActiveSheet.AutoFilter.Range
          For x = 43 To 3 Step -1                                  'вверху первых три строки-шапка
          Cells(x, 2).Select
          Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
          Next x
    End Sub
     
     
    тут проблема в том, что он открывает не отфильтрованные строки, а строки с соответствующими номерами в самой таблице без фильтровки (понимаю что так кодом прописано, но как правильно сообразить не могу)

    Всего записей: 9 | Зарегистр. 17-08-2010 | Отправлено: 21:02 17-08-2010
    Drazhar

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Глупый вопрос.
    как из Chart получить по точке значение по оси Х. Полчаса голову ломаю - не мог7у
     
    Разобрался. Оказывается у Series есть свойство XValues

    Всего записей: 88 | Зарегистр. 10-11-2009 | Отправлено: 16:36 18-08-2010 | Исправлено: Drazhar, 16:50 18-08-2010
    ol7ca

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет, участникам!
    Может кто-то подскажет какие-либо надстройки для эксель для построения диаграмм. Имею ввиду не традиционных диараграмм, что имеются в эксель, а что-то поинтереснее (на сколько это возможно), может даже интерактивные диаграммы, инструментальные панели...
    Для отображения диаграмм подойдут также другие программы, важно только использовать эксель как источник (базу данных) и в результате получать диаграммы в виде, удобном для презентации.  
    Буду благодарен за любую помощь и ссылки по теме.
    Спасибо.

    Всего записей: 125 | Зарегистр. 01-02-2007 | Отправлено: 17:51 18-08-2010
    lorents



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

    ----------
    Image Catalyst - оптимизация изображений без потери качества

    Всего записей: 3297 | Зарегистр. 30-12-2007 | Отправлено: 10:10 19-08-2010 | Исправлено: lorents, 13:27 19-08-2010
    Pavel745

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо Member! В литературе пока до таких тонкостей дойдешь, глаза посадишь.

    Всего записей: 2 | Зарегистр. 15-08-2010 | Отправлено: 19:37 22-08-2010
    Lovec



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как на VBA сделать что-то типа прогрессбара для пользователя при длительном процессе. Идет например перебор строк и пользователь видит какая щас перебирается и сколько осталось?
     
    Пробовал через форму. Но когда вызывается форма из макроса, то и управление ей передается и обратно возвращается лишь по закрытии формы. Соответственно я не могу из этого макроса передать данные на форму, ибо управление ушло к ней. Видимо надо код из макроса переносить в обработку события "UserForm_Initialize()"?
     
    Или как по другому?
     
    Может запустить окно Internet Explorer и в него данные передавать через WinAPI?

    Всего записей: 1028 | Зарегистр. 29-10-2002 | Отправлено: 15:23 23-08-2010
    LaCastet



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

    Цитата:
    Как на VBA сделать что-то типа прогрессбара для пользователя при длительном процессе.

    Я использовал это:
    progress-1.xls
    progress-2.xls
    progress-3.xls

    ----------
    Пиво — это еще одно доказательство того, что Господь любит нас и хочет, чтоб мы были счастливы!

    Всего записей: 4566 | Зарегистр. 27-07-2005 | Отправлено: 17:02 23-08-2010
    Drazhar

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Самый простой способ - использовать application.statusbar

    Всего записей: 88 | Зарегистр. 10-11-2009 | Отправлено: 17:19 23-08-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