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

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

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

    Цитата:
    а вот сделать так, чтобы ещё и кнопка работала

    Создаёте свой класс с кодом

    Код:
     
    Private WithEvents newButton As CommandButton
     
    Public Sub Create(ByVal onForm As MSForms.UserForm, ByVal Caption As String, _
                      ByVal Left As Single, Top As Single, _
                      ByVal Width As Single, ByVal Height As Single)
                       
           Set newButton = onForm.Controls.Add(bstrProgID:="", Visible:=True)
           newButton.Top = Top: newButton.Left = Left
           newButton.Width = Width: newButton.Height = Height
           newButton.Caption = Caption
    End Sub
     
    Private Sub newButton_Click()
        MsgBox "new button"
    End Sub
     

    И методом Create создаёте кнопку на форме и настраиваете обработчики событий. Старый, как этот форум, приём.

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 08:43 27-11-2012
    Maximus777

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
    вся соль заключается в том, что мне это требуется сделать в одном модуле. Ни форм, ни классов в проекте не должно быть. Только один VBAProject\Modules\Module1. То есть, абсолютный рантайм.

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 11:23 27-11-2012
    komputeryuzer

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    panda3
    Цитата:
    Ну так я и предложил способ, при котором ошибки не будет. Вместо того, чтобы его применить ты придумываешь свой, который выдает ошибку и жалуешься, что ничего не получается. Выглядит довольно странно...
    что предложил? можешь повторить? когда у меня нет ошибки (то есть сообщенмия об ошибке и остановки скрипта) но это не значит что работает корректно - да сообщения об ошибке нет но и не работает.. вот в чём беда.. если  вставлю перед этим оператор "он error ресуме нехт" то мой весь оператор(где я "на лету" пытаюсь проверить открыта ли Книга2.хлс) просто не срабатывает - молча обходится...
    ты говоришь(как я понял) у тебя 2003 и у тебя срабатывает коррекно.. а у меня 2010 и и меня не срабатывает корректно... либо ошибку выдает (и останавливается) либо молча пропускается
    если отдельно запустить какой то оператор и результать запомнить в перемнную то в нужном месте можно проверить эту проверить эту перемнную то тогда да.. так можно.. (я так и делаю сечас) но это же не  "на лету"..
    а ты говоришь что у тебя "на лету" получается....
    уххх!!! выдал!!! теперь понятно?

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 15:27 27-11-2012
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    komputeryuzer
    Вы может разберётесь с IsObject? panda3 дал прекрасную реализацию

    Цитата:
    [IsObject([[Книга2]Лист1!A1])  

    Этот код выполняется (в 2010 тоже) для вновь созданной книги именно в такой нотации.
    Для уже существующей (сохранённой на диск) нужно писать, например:
    IsObject(['d:\path\[Книга2.xlsx]Лист1'!A1]) - такой же формат прописывается в ячейке к данным в другой книге (без общих [])
    или упрощённо (тоже работает)
    IsObject([[Книга2.xlsx]Лист1!A1])  
     
    panda3
    Отдельное спасибо за находку.

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 11:09 28-11-2012
    komputeryuzer

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

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 13:06 28-11-2012
    komputeryuzer

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    вот так получается  IsObject([[Книга2.xlsx]Лист1!A1])  
    но если вместо Лист1 вписать имя с пробелами  то не работает
    IsObject([[Книга2.xlsx]Отчёт за октябрь (2012 года)!A1])  
    IsObject([[Книга2.xlsx][Отчёт за октябрь (2012 года)]!A1])  
    IsObject([[Книга2.xlsx]"Отчёт за октябрь (2012 года)"!A1])  

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 19:25 28-11-2012
    psiho

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

    Цитата:
    но если вместо Лист1 вписать имя с пробелами  то не работает

    Если в именах есть пробелы, то всё имя заключается в одинарные кавычки

    Всего записей: 247 | Зарегистр. 26-10-2006 | Отправлено: 07:46 29-11-2012 | Исправлено: psiho, 07:47 29-11-2012
    kate821

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет, подскажите плиз, возможно ли вообще такое:
    ставить пароль на нужный нам срок, т.е поставили пароль, отправили, через три дня (например)  он должен попросить пароль. Уверена что базовые возможно Эксель такой штуки сделать не позволяют. Сама о такой штуке ни разу не слышала, но начальник зверствует, что это возможно. Есть какие то мысли по этому поводу? Спасибо)

    Всего записей: 2 | Зарегистр. 29-11-2012 | Отправлено: 12:32 29-11-2012
    komputeryuzer

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psiho
    Цитата:
    Если в именах есть пробелы, то всё имя заключается в одинарные кавычки
    где то я такое видел но когда пробовал вба понялал как коментарий поэтому пробовал все виды кавычек кроме них...
    это остается в силе и когда иня используется через переменную?
    дим а ас стринг = "'a a'"
    так?
     

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 15:43 29-11-2012
    psiho

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

    Цитата:
    Привет, подскажите плиз, возможно ли вообще такое

    Если Вы имеете ввиду пароль на книгу Excel, то он спокойно вскрывается. Другое дело, если отправлять файл Excel,упакованный архиватором(например WinRAR). Тогда можно поставить пароль. В Вашем случае нужна конкретика задачи.
     
    Добавлено:

    Цитата:
    это остается в силе и когда иня используется через переменную?

    Да. Например:

    Код:
     
    dim strwbName as string
    strwbName="'[Книга2.xlsx]Отчёт за октябрь (2012 года)'!"
    IsObject([strwbName & "A1"])  
     

    Всего записей: 247 | Зарегистр. 26-10-2006 | Отправлено: 15:50 29-11-2012 | Исправлено: psiho, 15:58 29-11-2012
    Black_Lung



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kate821
    в Workbook_Open записать дату отправки и её проверку с текущей датой, если больше на 3 дня то поставить пароль.

    Всего записей: 275 | Зарегистр. 09-10-2008 | Отправлено: 15:58 29-11-2012
    komputeryuzer

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psiho спасибо.. мне вообщето надо составное имя а не такое подстановочное
    иня файля одна перемнная имя листа другая а ячейка в третьей переммной.. ладно вечером буду пробовать..
    ой!!! я сейчас у тебя заметил... одинарные кавычка подхватывают и имя книги что ли?!
    вот что мне мешает видать...
    я всё сую [книга1]'лист1'!а1 - во блин намудрили...

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 17:19 29-11-2012
    kate821

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Black_Lung
    Спасибо за совет, будем решать задачку дальше))

    Всего записей: 2 | Зарегистр. 29-11-2012 | Отправлено: 21:55 29-11-2012
    Leojse

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте. Подскажите, возможно ли сделать так, чтобы при внесении данных в ячейку С12 и U12 данные автоматически переносились в I12 и J12 соответственно? А затем, когда скопировались последние ячейки (С17 и D17), начали копироваться следующие ячейки E18 и F18 в I18 и J18. "Копировать-Вставить", применять формулу C12=I12, а потом растягивать проблематично- так как очень много ячеек в документе.
    Скриншот прилагаю.  
    Заранее большое спасибо.
    http://imageshack.us/photo/my-images/689/83669655.png/

    Всего записей: 107 | Зарегистр. 05-11-2009 | Отправлено: 16:10 01-12-2012
    andrewkard1980

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Leojse
    Вставьте в модуль требуемого листа следующий код:

    Код:
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rRg As Range, rCell As Range
    Dim lLr: lLr = 5000 'Измените на требуемое кол-во строк
     
    Set rRg = Intersect(Target, Range("c12:d17", "e18:f" & lLr))
    If Not rRg Is Nothing Then
        For Each rCell In rRg
        Select Case rCell.Column
        Case 3, 5
        Cells(rCell.Row, 9) = rCell.Value
        Case 4, 6
        Cells(rCell.Row, 10) = rCell.Value
        End Select
        Next rCell
    End If
    End Sub

    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 20:55 01-12-2012 | Исправлено: andrewkard1980, 20:57 01-12-2012
    Leojse

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    andrewkard1980
    Спасибо, что откликнулись.  
     Хотел сам допилить, но совсем уж не получается....  
     Более подробно объясню, что мне нужно.  
     Вообщем, имеется отчет (скрин приложу). В колонки Январь (5,6), Февраль(7,8), Март (5,6) данные вводятся вручную. Хотелось бы, чтобы "1 квартал" формировался сам, то есть чтобы автоматически данные соответственно переносились с января, февраля, марта в соответствующие колонки в "1 квартал". Затем вручную я заполняю Апрель, Май, Июнь. Потом идет "1 полугодие", которое, заполнялось бы тоже автоматически, то есть брались бы данные с первого квартала и заполнялись бы далее с Апреля, Мая, Июня. Затем, опять вручную Июль, Август, Сентябрь. Снова бы хотелось автоматического заполнения "9 месяцев" - данные бы брались из 1 полугодия и добирались с Июля, Августа, Сентября. Октябрь, ноября, Декабрь - вручную, а "Год" - автоматически, т.е. копировались бы "9 месяцев" и добирались бы данные с Октября, Ноября, Декабря.  
     В отчете более 1500 строчек. Количество столбцов не меняются. Строчки добавляются в конец раздела. Разделов очень много.  
     Заранее спасибо за помощь.  
    http://imageshack.us/photo/my-images/12/2222df.jpg/

    Всего записей: 107 | Зарегистр. 05-11-2009 | Отправлено: 13:33 02-12-2012 | Исправлено: Leojse, 16:07 02-12-2012
    andrewkard1980

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

    Код:
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rRg As Range, rCell As Range
    Dim lLr: lLr = 200 ' глубина строк
     
    Set rRg = Intersect(Target, Range("E1:AH" & lLr))
    If Not rRg Is Nothing Then
        For Each rCell In rRg
        Select Case rCell.Column ' номер столбика
        Case 5, 7, 9
        Cells(rCell.Row, 11) = rCell.Value
        Cells(rCell.Row, 19) = rCell.Value
        Cells(rCell.Row, 27) = rCell.Value
        Cells(rCell.Row, 35) = rCell.Value
           
        Case 6, 8, 10
        Cells(rCell.Row, 12) = rCell.Value
        Cells(rCell.Row, 20) = rCell.Value
        Cells(rCell.Row, 28) = rCell.Value
        Cells(rCell.Row, 36) = rCell.Value
         
        'далее аналогично        
         
        End Select
        Next rCell
    End If
    End Sub


    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 19:32 02-12-2012 | Исправлено: andrewkard1980, 19:33 02-12-2012
    Leojse

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    andrewkard1980
    Спасибо, но что-то не получается... Вставляю ваш код в модуль листа, но ничего не происходит. Пожалуйста, помогите. Не могли бы вы пошагово расписать, как добавить макрос в книгу? Просто я очень не силен в VBA.
     
    Добавлено:
    andrewkard1980
    Может, вам скинуть файл?
     
    Добавлено:
    Всё, разобрался. Но снова прошу помощи...  
    В ваш код вставляю следующие колонки:
        Case 13, 15, 17
        Cells(rCell.Row, 19) = rCell.Value
        Cells(rCell.Row, 27) = rCell.Value
        Cells(rCell.Row, 35) = rCell.Value
         
        Case 14, 16, 18
        Cells(rCell.Row, 20) = rCell.Value
        Cells(rCell.Row, 28) = rCell.Value
        Cells(rCell.Row, 36) = rCell.Value
    И апрель, май, июнь уже не копируются в полугодие, 9 месяцев и в год. Это можно поправить?

    Всего записей: 107 | Зарегистр. 05-11-2009 | Отправлено: 20:51 02-12-2012 | Исправлено: Leojse, 22:21 02-12-2012
    shkval100shtorm



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите пожалуйста по проблемке.  
    В поиске решение проблемы не нашел.
    Установлен Excell 2010. В книге personal.xlsb сохранены все рабочие макросы на все случаи жизни .
    Personal.xlsb открывается в невидимом режиме. Если же я открываю следующий файл с расширением .xls то открытие файла сопровождает открытие еще одного экземпляра personal.xlsb с формулировкой "Редактирование 'personal.xlsb' запрещено пользователем".
    Честное слово задолбало уже!
    Помогите пожалуйста.

    Всего записей: 18 | Зарегистр. 26-10-2012 | Отправлено: 12:30 03-12-2012
    komputeryuzer

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    нарот помогите добить исобйект().. беследний рывок
     
    вот так вроде работает:
    IsObject(['[Отчёты за 2012 год.xlsx]Отчёт за октябрь (2012 года)'!A1])
     
    а так через перемнные нет (у меня как раз перемнные):
     
    dim otchety as string = "Отчёты за 2012 год.xlsx"
    dim otchetoktyabr as string ="Отчёт за октябрь (2012 года)"
    dim aaa as string = "'[" & otchety & "]" & otchetoktyabr & "!A1"
    IsObject([aaa])

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 16:14 03-12-2012
    Открыть новую тему     Написать ответ в эту тему

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