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

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

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

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
    aha



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

    Код:
    Public Sub Штамп()
    SendKeys "Пожалуйста, дайте ответ "
    SendKeys Date + 3
    SendKeys ("{NUMLOCK}")
    DoEvents
    End Sub

    подскажите, как сделать, чтобы дата на 3 дня вперед вставлялась при попадании на субботу и\ или воскресенье на понедельник, т.е. на первый рабочий день?

    Всего записей: 906 | Зарегистр. 13-03-2004 | Отправлено: 23:56 05-09-2010
    smirnvlad

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

    Код:
     
    Public Sub Штамп()
    SendKeys "Пожалуйста, дайте ответ "
    curdate = Date
    If Weekday(curdate + 3) = vbSaturday Then
        SendKeys curdate + 5
    ElseIf Weekday(curdate + 3) = vbSunday Then
        SendKeys curdate + 4
    Else
        SendKeys curdate + 3
    End If
    SendKeys ("{NUMLOCK}")
    DoEvents
    End Sub
     

     
    Добавлено:
    Frantishek
    а файл можно увидеть?

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 06:42 06-09-2010 | Исправлено: smirnvlad, 07:05 06-09-2010
    dneprcomp



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

    Код:
     
    dim strTemp as string
    dim intTemp as string
     
    intTemp=3
     
    strTemp=TEXT(Date + intTemp, "ddd")
    if strTemp="Sun" then
        intTemp=4
    if strTemp="Sat" then
        intTemp=5
    end if
     
    SendKeys Date + intTemp

     
    '-------------------------------
    'Days Sun–Sat "ddd"  
    'Days Sunday–Saturday "dddd"  

    Всего записей: 3922 | Зарегистр. 31-03-2002 | Отправлено: 06:53 06-09-2010
    aha



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    smirnvlad
    спасибо, попробовал, но переводит дату все равно на выходные тоже...
    dneprcomp
    strTemp=TEXT выдает ошибку на этой строке

    Всего записей: 906 | Зарегистр. 13-03-2004 | Отправлено: 09:40 06-09-2010
    Drazhar

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Глупый вопрос.
    91-я ошибка(Object variable not set и т.д.) на строке
    Set oApp = CreateObject("Shell.Application")
    Переменная димнута как object
    oApp As Object
    Проблем в рефах нет.
    Куда копать?
    Заранее спасибо.

    Всего записей: 88 | Зарегистр. 10-11-2009 | Отправлено: 10:25 06-09-2010
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aha
    Строка в коде должна быть полностью:
    strTemp = TEXT(Date + intTemp, "ddd")  
    Если не работает, то или переменные не инициализированы, или возможно данная версия офиса не поддерживает функцию TEXT. У меня 2010.
    Еще может быть Excel не может получить значение  Date + intTemp внутри  TEXT.  
     
    Добавил
    A, фунция Date в Excel возвращает совсем не дату.  
    Попробуй Now:  
    dim TempDate as date
    TempDate = Now + 3
    strTemp = TEXT(TempDate, "ddd")

    Всего записей: 3922 | Зарегистр. 31-03-2002 | Отправлено: 10:47 06-09-2010 | Исправлено: dneprcomp, 10:57 06-09-2010
    oshizelly



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот, пару недель назад спрашивал про код, предложенный SAS888, но так пока никто и не ответил
    00:34 27-08-2010
    Цитата:
    Если две соседние ячейки разделены границей, то она почему-то не сбрасывается этим макросом.  Наверное, эта общая граница является каким-то особым элементом оформления? А какой командой сбросить и ее тоже?

     

    Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 11:49 06-09-2010 | Исправлено: oshizelly, 11:51 06-09-2010
    smirnvlad

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

    Код:
     
        For Each x In Array(xlDiagonalDown, xlDiagonalUp, xlEdgeLeft, xlEdgeTop, xlEdgeBottom, xlEdgeRight, xlInsideVertical, xlInsideHorizontal): Selection.Borders(x).LineStyle = xlNone: Next
     

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 12:48 06-09-2010
    Frantishek



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    smirnvlad
    http://zalil.ru/29641475

    Всего записей: 1276 | Зарегистр. 02-05-2006 | Отправлено: 12:52 06-09-2010
    smirnvlad

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aha
    только что проверил
    сегодня 6 после выполнения получаем 09.09.2010
    перевел дату на 7 - 10.09.2010
    8 - 13.09.2010
    9 - 13.09.2010
    10 - 13.09.2010
    11 - 14.09.2010
    12 - 15.09.2010
    разве не так должно быть?

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 12:58 06-09-2010
    oshizelly



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    smirnvlad 11:48 06-09-2010
    Это работает. Спасибо!

    Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 14:46 06-09-2010
    smirnvlad

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frantishek
    посмотрел в 2007, теперь без ошибки
    а сдвиг происходит из-за масштаба в 2007, там он по умолчанию 120%, если переключить на 100% всё ровно, как это исправить - не знаю
    Подробнее...

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 15:00 06-09-2010
    aha



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

    Всего записей: 906 | Зарегистр. 13-03-2004 | Отправлено: 19:58 06-09-2010
    Frantishek



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    smirnvlad
    Спасибо, теперь порядок!
     
    А возможно ли соорудить макрос, который импортирует данные из файла xls, лежащего в одной папке с исходным, без указания пути?
    Скажем, в коде сразу строго забиваются имена по умолчанию (файл-лист для целевого и исходного файла), и определяются массивы ячеек для синхронизации вида E5:G8;I5:J12;... (адреса также едины)
    Если ответ "да", то как такое может выглядеть на примере.. Спсб.

    Всего записей: 1276 | Зарегистр. 02-05-2006 | Отправлено: 13:58 10-09-2010 | Исправлено: Frantishek, 14:04 10-09-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frantishek, запросто! Thisworkbook.Path возвращает путь к ТЕКУЩЕЙ книге, с его помощью можно открыть и другой файл, а затем считать нужные данные.

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

    Всего записей: 4293 | Зарегистр. 22-06-2002 | Отправлено: 14:03 10-09-2010
    Frantishek



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ZlydenGL
    А как это в коде.. там же вроде немного строк должно получится.. Если по схеме:
    -получаем путь
    -обращаемся к целевому файлу-листу (переменная)+(путь)=адрес за чтением данных в массивах (переменная)
    - перекидываем эти данные к себе в те же ячейки с сохранением форматов
    end  
    (выполнение по кнопке на исходном файле)
    (интересно, в 34 еще не поздно стать программистом?

    Всего записей: 1276 | Зарегистр. 02-05-2006 | Отправлено: 14:08 10-09-2010 | Исправлено: Frantishek, 14:12 10-09-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Самый простой вариант, когда все данные валяются в переменных. Как заточить на динамику - думай сам
     

    Код:
    Const SourceName As String = "sourcebook.xls"
    Const SourceSheet As String = "data"
    Const SourceFirstRow As Long = 1
    Const SourceLastRow As Long = 5
    Const SourceFirstCol As Byte = 1
    Const SourceLastCol As Byte = 3
     
    Dim S_WB As Workbook, I As Long, J As Byte
     
    Set S_WB = Workbooks.Open(Thisworkbook.Path & SourceName, False, True)
    S_WB.Worksheets(SourceSheet).Activate
     
    For I = SourceFirstRow To SourceLastRow
         For J = SourceFirstCol To SourceLastCol
              Thisworkbook.Activesheet.Cells(1 + I - SourceFirstRow, 1 + J - SourceFirstCol) = S_WB.Cells(I, J)
         Next J
    Next I

     
    Этот код берет данные из книги sourcebook.xls с листа data, с диапазона A1:C5, и переносит их на активный лист книги с макросом, в область той же размерности с левой верхней координатой A1. Дальше попробуй сам, 34 - это еще совсем молодой

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

    Всего записей: 4293 | Зарегистр. 22-06-2002 | Отправлено: 14:30 10-09-2010
    Frantishek



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ZlydenGL
    Спасибо! Я вот только не понял, если данные кусочно тянуть, из разных мест на листе (типа E5:G8;I5:J12;...) и туда же вставлять, какие переменные менять?

    Всего записей: 1276 | Зарегистр. 02-05-2006 | Отправлено: 15:56 10-09-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frantishek, тэкс, понятно... То, что файл-источник данных остается открытым, ты не углядел С программированием ВООБЩЕ раньше сталкиваться не приходилось?
     
    В случае с кусочным подтягиванием данных есть 2 самых простых варианта:
    1. Делаем промежуточный лист, на него тянем все данные, а из этого листа формулами "выкусываем" все необходимое. Подходит только для того случая, когда структура отчета-источника данных будет неизменной.
    2. Используем именованные области для вытаскивания данных, и пробегаясь по всем областям книги-источника данных выкусываем данные в этих областях с записью их в книгу-приемник.
     
    А можно теоретический вопрос? Почему данные вообще оказываются в "посреднической" книге? Может быть имеет смысл книгу-источник и книгу-приемник объединить в одну?

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

    Всего записей: 4293 | Зарегистр. 22-06-2002 | Отправлено: 16:04 10-09-2010
    Frantishek



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

    Цитата:
    С программированием ВООБЩЕ раньше сталкиваться не приходилось?  

    Только на уровне Т3 и рисования фейсов в Access

    Цитата:
    Почему данные вообще оказываются в "посреднической" книге?

    Версификация. Штука вот в чем. Есть некий Excel-документ, функционал которого (в основном учетные формы) постоянно изменяется административной стороной. Есть пользователи, которые ведут в нем записи. Необходимо реализовать подход при котором пользователи получали бы новый фейс (путем простой замены этого документа с макросами) но восстанавливали свои накопленные данные (путем импорта из старых версий). Данные представляют собой несколько фиксированных табличек на одном листе. Их адреса меняются только вглубь, по мере заполнения (т.е. построчно), вот их все и надо перекидывать в новую учетную форму, и так каждый раз, т.к. функционал дополняется возможностями, а сами формы корректируются
     
    Добавлено:
    Да, чтобы прояснить почему нельзя тупо скопировать, в силу специфики, пользователи более чем блондинистые
     
    Т.е. пример. Был файл скажем File_12, потом вышла версия File_13. Требуется используя возможности (формы) новой версии обеспечить преемственность учета старых данных, и с этой целью перенести их в новую форму простым нажатием одной кнопки (файлы хранятся в одной папке, старые потом удаляются). Структура данных предполагается что меняться не будет (по крайней мере, какое-то продолжительное время). Но, вероятно, нет проблем чтобы потом технически также обеспечить преемственность по адресам задав параметры синхронизации, типа того, что массив E5:G8 перелетает в новой версии уже по адресу E6:G9. Как то так

    Всего записей: 1276 | Зарегистр. 02-05-2006 | Отправлено: 17:12 10-09-2010 | Исправлено: Frantishek, 17:32 10-09-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 214

    Компьютерный форум 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