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

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

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

    Цитата:
    Подскажите плз кодик для написания Фамилии Имени и По-батюшки с большой букви.  
    Ето один текстбокс. Ну и запрет двойного пробела.  


    Код:
    Private Sub TextBox1_AfterUpdate()
    Dim aText() As String, strText As String, i As Byte
     
    strText = Trim(TextBox1.Text)
    Do While InStr(1, strText, "  ") > 0
        strText = Replace(strText, "  ", " ")
    Loop
    aText = Split(strText)
    For i = 0 To UBound(aText)
        aText(i) = UCase(Left(aText(i), 1)) & _
            LCase(Right(aText(i), Len(aText(i)) - 1))
    Next i
    Me.TextBox1 = Join(aText)
    End Sub

     
    Добавлено:
    Обращаю внимание, что в процедурка приведена в кач-ве примера (в ней отсутствует обработчик ошибок)

    Всего записей: 258 | Зарегистр. 22-01-2008 | Отправлено: 14:55 21-02-2010
    NJCorp

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dneprcomp
    PROPER ет я так понимаю ПРОПНАЧ на руском
    ето оно, но мне нужно в ВБА
     
    vlth
    Спасибо, то что нужно.
    (там кажись и негде ошибиться )

    Всего записей: 72 | Зарегистр. 18-08-2007 | Отправлено: 04:06 22-02-2010
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NJCorp
    Уж не знаю, как оно там на русском, но Proper это функция VBA Excel. Точно такая как и Lower или Upper.

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 04:37 22-02-2010
    vlth

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

    Цитата:
    там кажись и негде ошибиться  

    А если, скажем, содержимое текстбокса будет удалено? - вот и первая ошибка.

    Цитата:
    dneprcomp  
    PROPER ет я так понимаю ПРОПНАЧ на руском  
    ето оно, но мне нужно в ВБА
    Имеется в виду
    Код:
    strText = Application.WorksheetFunction.Proper(strText)
    Т.е. с помощью PROPER() можно переписать код так:

    Код:
    Private Sub TextBox1_AfterUpdate()  
    Dim strText As String
     
    strText = Trim(Me.TextBox1.Text)  
     
    Do While InStr(1, strText, "  ") > 0  
        strText = Replace(strText, "  ", " ")  
    Loop  
     
    Me.TextBox1  = Application.WorksheetFunction.Proper(strText)
     
    End Sub

     
    dneprcomp

    Цитата:
    но Proper это функция VBA Excel
    Не, не VBA - это функция раб. листа Excel. Она же ПРОПНАЧ() в русской локализации.
     
    Можно ещё так:
    Код:
    Me.TextBox1 = StrConv(strText, vbProperCase)

    Всего записей: 258 | Зарегистр. 22-01-2008 | Отправлено: 10:59 22-02-2010 | Исправлено: vlth, 18:27 25-04-2010
    NJCorp

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

    Цитата:
    А если, скажем, содержимое текстбокса будет удалено? - вот и первая ошибка.  

    Ну в моем случае ето не грозит, у меня проверять надо не только етот ткестбокс, я проверяю MouseMove кнопки записи даних.
     

    Код:
    Me.TextBox1  = Application.WorksheetFunction.Proper(strText)  

     
    О, супер. Четко и лаконично.  
    vlth
    dneprcomp
    Большле спасибо

    Всего записей: 72 | Зарегистр. 18-08-2007 | Отправлено: 23:03 22-02-2010
    crotoff

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Excel 2007: напомните битте как в макросе определить самую нижнюю строчку в БД. В полях присутствуют пустые элементы, заранее кол-во строк неизвестно - данные экспортируются из SAP

    Всего записей: 961 | Зарегистр. 17-04-2007 | Отправлено: 11:54 24-02-2010
    ZlydenGL



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

    Код:
    Cells.SpecialCells(xlCellTypeLastCell).Row


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

    Всего записей: 4268 | Зарегистр. 22-06-2002 | Отправлено: 11:55 24-02-2010
    crotoff

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В БД 87 полей: в 88й и 89й столбцы хочу вставить формулы с ВПР(), если вставить до конца листа - формулы слишком долго пересчитываются; нужно найти № самой последней строки

    Всего записей: 961 | Зарегистр. 17-04-2007 | Отправлено: 11:58 24-02-2010
    ZlydenGL



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

    Код:
    Range(Cells(1, 88), Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 88)).FormulaR1C1 =  

    А дальше - пишешь свою формулу в формате R1C1 соответственно Естественно, в виде строки (т.е. заключенную в кавычки), и начинающуюся со знака "=".

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

    Всего записей: 4268 | Зарегистр. 22-06-2002 | Отправлено: 12:03 24-02-2010 | Исправлено: ZlydenGL, 12:08 24-02-2010
    crotoff

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ZlydenGL
    спасибо, получилось
     Range("ck2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 89)).FormulaR1C1 = "=VLOOKUP(RC[-88],'бла-бла'!C1:C3,3,0)"

    Всего записей: 961 | Зарегистр. 17-04-2007 | Отправлено: 12:20 24-02-2010 | Исправлено: crotoff, 12:21 24-02-2010
    zerbino



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Приветствую! Намедни пришлось искать решение одной проблемы. Решение в рунете я не нашел, но повезло найти на нерусском источнике. Итак:
     
    Допустим все ссылки ведут на сайт и исходный путь такой начинается с  "http://www.site.ru/catalogue/" с папками внутри, а надо сделать, чтобы в итоге, как вариант, ссылка, например, вела на локальный каталог, который находится в той же папке, что и xls файл и имеет такую же структуру, что и в первичном источнике.
     
    =============================================================
    замена текста гиперссылки с отображением пути в ячейке на странице:
    =============================================================
    Sub ReplaceHyperlinks()
    Dim h As Hyperlink
    Dim intWrksheets As Integer
     
    Const OLD_PATH = "http://www.site.ru/catalogue/" 'Старый путь:: Должно заканчиваться обратным слэшем
     
    Const NEW_PATH = "catalogue/" 'Поменять на то, чем нужно заменить:: Должно заканчиваться обратным слэшем
     
    For intWrksheets = 1 To ActiveWorkbook.Worksheets.Count 'для каждого листа в книге
    For Each h In Worksheets(intWrksheets).Hyperlinks 'для каждой гиперссылки в листе
    h.Address = Replace(h.Address, OLD_PATH, NEW_PATH, 1, 1)
    h.TextToDisplay = Replace(h.Address, OLD_PATH, NEW_PATH, 1, 1)
    Next
    Next
     
    End Sub
    =============================================================
    и второй вариант, без замены отображаемого текста гиперссылки в ячейке
    =============================================================
    Sub ReplaceHyperlinks()
    Dim h As Hyperlink
    Dim intWrksheets As Integer
     
    Const OLD_PATH = "http://www.site.ru/catalogue/" ':: MUST END IN BACKSLASH
     
    Const NEW_PATH = "catalogue/" 'Change as required:: MUST END IN BACKSLASH
     
    For intWrksheets = 1 To ActiveWorkbook.Worksheets.Count 'for every sheet in the workbook
    For Each h In Worksheets(intWrksheets).Hyperlinks 'for every hyperlink in the sheet
    h.Address = Replace(h.Address, OLD_PATH, NEW_PATH, 1, 1)
    Next
    Next
     
    End Sub
    =============================================================
    Пользуйтесь)
     
    Например если вначале все ссылки вели на
    "http://www.site.ru/catalogue/folder1/pic.jpg"
    "http://www.site.ru/catalogue/folder2/pic2.jpg" и т.д.,
    то после выполнения указанного скрипта ссылки будут вести на
    "<Локальный путь до папки, где лежит xls файл+>/catalogue/folder1/pic.jpg"
    "<Локальный путь до папки, где лежит xls файл+>/catalogue/folder2/pic2.jpg" и т.д
    пути можно, конечно, заменять на любые другие, т.е. не локальные в т.ч.

    Всего записей: 545 | Зарегистр. 09-06-2003 | Отправлено: 14:13 27-02-2010 | Исправлено: zerbino, 14:20 27-02-2010
    Kirov23

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте, подскажите пожалуйста. Как отнять несколько процентов от отдельной колонки? Спасибо!

    Всего записей: 7 | Зарегистр. 28-10-2008 | Отправлено: 13:14 01-03-2010
    randomar

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите пожалуйста одну маленькую задачку по VBA...
    Определить, пересечёт ли прямая ax+by+c=0 a)ось 0х, б)ось 0у.  
    з.ы.Всё надо в одном алгоритме. Зарание благодарен

    Всего записей: 6 | Зарегистр. 12-01-2010 | Отправлено: 00:04 02-03-2010
    Maximus777

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите плиз. Как можно привязать функцию к контролу, который создаётся в runtime? Т.е. на форме, в процессе выполнения, создаётся ListView с чекбоксами. Дык вот как организовать функцию Item_Check?

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 13:04 02-03-2010
    TimoXa_Skot



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    randomar
    Пересечение с осью ОХ это y=0
    Пересечение с осью ОY это x=0
     
    If y=c/b or x=c/a then Msgbox("График пересечет оси координат")
     
    Добавлено:
    Kirov23
    если в VBA  
    выделяем нужный диапазон и выполняем макрос:
     
                Dim k ' Нужный процент
                For Each sw In Selection
                    f = f + sw*k
                Next
                Range("нужная ячейка").Select
                ActiveCell.FormulaR1C1 = f
     
    Макрос сложит колонку и выведет результат в нужную ячейку

    Всего записей: 53 | Зарегистр. 16-11-2008 | Отправлено: 16:59 02-03-2010
    FlashBack



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

    Всего записей: 196 | Зарегистр. 13-03-2006 | Отправлено: 10:25 03-03-2010
    NJCorp

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

    Всего записей: 72 | Зарегистр. 18-08-2007 | Отправлено: 11:52 03-03-2010
    Johnson Finger



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Господа, подскажите по следующей проблемке. есть файлик с неким макросом, когда запускаю его у себя (макрос) обычно в произвольном месте выскакивает сообщение "Code execution has been interupted" и предлагает стандартное окно с дебагом, продолжением и т.д. Если нажать "Продолжить", вылезет это окно еще раз и дальше все норм. Что интересно, если этот же файл запускать на другой машие (версии офиса одинаковые), все работает прекрасно. Различается только система - там где все работает, русская ХР, где спотыкается Английская версия 2003-го сервера. раньше подобных проблем не наблюдал. Причем если шагать по коду (F8), то никаких окошек не вылазеет в принципе. Или иногда вообще также все работает. Короче зависимости я никакой не заметил.
     
    И вопрос номер два, есть конструкция вида:
     
    For Each Pattern In Range(Cells(1, 3), Cells(100, 3))
     
    "тут код, который что-то делает"
     
    Next
     
    Собственно вопрос, можно ли как-то сделать так, чтобы когда в моменте "тут код, который что-то делает", когда выполняется некое условие и мы доходим до Next, следующий экземпляр "Pattern" брался не следующий по порядку, а например, через 10 следующих экземпляров?

    Всего записей: 1177 | Зарегистр. 06-08-2006 | Отправлено: 23:03 03-03-2010
    vlth

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

    Цитата:
    For Each Pattern In Range(Cells(1, 3), Cells(100, 3))  
     
    "тут код, который что-то делает"  
     
    Next  
     
    Собственно вопрос, можно ли как-то сделать так, чтобы когда в моменте "тут код, который что-то делает", когда выполняется некое условие и мы доходим до Next, следующий экземпляр "Pattern" брался не следующий по порядку, а например, через 10 следующих экземпляров?

    Нет, нельзя. Даже адрес следующего диапазона в наборе получить не выходит (скажем, выражение Range(Cells(1, 3), Cells(100, 3)).Cells.Item(i +1), где i - счётчик цикла, будет ссылкой не на следующий в выборке, а на прилегающий диапазон).
    Выход вижу в создании массива адресов Range(Cells(1, 3), Cells(100, 3)) с соответствующей заменой конструкции на For Each-Next на For-Next:

    Код:
    For i=0 to UBound(МассивАдресов)
        ...
        If ... Then i = i +10
        ...
    Next

    Всего записей: 258 | Зарегистр. 22-01-2008 | Отправлено: 10:41 04-03-2010 | Исправлено: vlth, 13:21 04-03-2010
    Johnson Finger



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vlth - я так и сделал, попробовав решение с просто For-Next, в итоге получилось добится, чтобы необходимое условие из выборки бралось из произвольного места. Только этот способ работает ооооочень долго, ибо критериев, которые необходимо найти около 400-т, а массив, где происходит поиск, содержит около 3 500 строк, плюс, когда нужный китерий находится, то вся строка копируется в тот диапазон, где находится это самое условие, соответственно адрес диапазона из которого беруться данные для поиска постоянно меняется. Как седсве, весь процесс дико затягивается. (однако For Each Pattern In Range работает почему то быстрее). Сейчас еще попробую метод прямого поиска через Search:What, предвариительно, скорость поиска выросла в несколько раз, т.к. не приходится шерстить все 3 500 строк.

    Всего записей: 1177 | Зарегистр. 06-08-2006 | Отправлено: 11:08 04-03-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