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

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

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

ShIvADeSt (11-01-2010 10:17): http://forum.ru-board.com/topic.cgi?forum=33&topic=10903  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

ShIvADeSt



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

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

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

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:58 23-04-2007 | Исправлено: JekG, 22:32 10-01-2010
    ecolesnicov

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MaximuS G
     
    Передавать аргументы функции Inputbox не явными значениями, а переменными, которые задавать где-то раньше.
     

    Код:
     
    For i = 7 To 21
     
        arg1="ввод"+Cstr(i)
        arg2="привет"+Cstr(i)
         
        On Error Resume Next
        iNumber = Application.InputBox(arg1, arg2)
        If iNumber = 0 Then
            Cells(i, 5) = 0
        Else:
            Cells(i, 5) = iNumber
           
        End If
        Next
     
     

    Всего записей: 251 | Зарегистр. 05-08-2005 | Отправлено: 18:01 28-08-2008
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ecolesnicov
     
    Спасибо.. )) Извините, наверное неточно написал... Я имел ввиду, что значения должны быть совсем разные... ну сейчас получаеться так: ввод1, ввод2(сам же так написал!), а мне нужно что бы было например: упр, адм, стсмен, и т.д...

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 18:12 28-08-2008 | Исправлено: MaximuS G, 18:17 28-08-2008
    IgrokBB

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день!
     
    1. В некой ячейке, скажем А1, с периодичностью в n секунд происходит вычисление значения (ввод данных в исходный лист осуществляется внешним приложением);
     
    Можна ли в Екселе реализовать следующее:
     
    1.После каждого такого вычисления сохранять его результат в колонке, скажем В, а рядом в колонке С в той же строке сохранять его временные метки.
    2. По достижению в колонке В строки 65 тыс (может понадобиться и меньше) происходил сдвиг данных вверх, тоесть самые старые данные удалялись, а внизу прописывались самые свежие данные. Что-то похожее на "временное окно"...
     
    Если в самом Екселе - еще куда ни шло разбираюсь, то в VBA - не знаю с чего и начать/подступиться?!
     
    НЕ ПРОГРАММИСТ...
     
    Спасибо!

    Всего записей: 1 | Зарегистр. 28-08-2008 | Отправлено: 21:43 28-08-2008
    ecolesnicov

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MaximuS G
    Суть дела от этого не меняется. В любом случае передаем аргументы функции Inputbox не явными значениями, а переменными. А вот как - вариантов очень много ...
    1) можно по примитивному через If ... elseif ... и т.д.
    2) более "красивый" вариант: Select case ...
    3) Заранее задаем массив (array) значений, а в момент присваивания - выбираем из этого массива по i.
    4) выносим это все в отдельную функцию, результатом которой будет возвращение этих переменных.
     
    Добавлено:
    IgrokBB
    Да. реализовать все перечисленное можно без особых проблем.
    Начинать надо с записи макросов и их рассмотрения (в Excel делаем какие-то действия, записываем макрос - смотрим как эти действия "выглядят" в VBA). А дальше - документация ... Я тоже не программист - мне кажется что основным фактором способствующем моему освоению VBA стало понимание объектной модели Excel - как только я в нее врубился - дело пошло очень даже хорошо! Заранее извиняюсь у профи - мнение сугубо субъективное ...

    Всего записей: 251 | Зарегистр. 05-08-2005 | Отправлено: 09:10 29-08-2008
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ecolesnicov
     
    Спасибо, через If код очень длинный будет, у меня 15 значений, а если их 1000!!!
     
    Вот код, могли бы Вы мне подсказать как сделать короче и красивее, если не тяжело с предложеным Вами Select case и Array
     

    Код:
     
        For i = 7 To 21
         
        arg = "vvod znacheniy"
        arg2 = "upr"
        arg3 = "adm"
         
        If i = 7 Then
        On Error Resume Next
        iNumber = Application.InputBox(arg2, arg)
        If iNumber = 0 Then
            Cells(i, 5) = 0
        Else:
            Cells(i, 5) = iNumber
           
        End If
        End If
         
        If i = 8 Then
        On Error Resume Next
        iNumber = Application.InputBox(arg3, arg)
        If iNumber = 0 Then
            Cells(i, 5) = 0
        Else:
            Cells(i, 5) = iNumber
        End If
        End If
         
        Next
     

     
    Добавлено:
    Также может прошлый вопрос подскажите ?
     
    Подробнее...

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 09:46 29-08-2008
    ksodi

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте! Подскажите, как правильно реализовать следующую идею.
    Имена листов в виде   Лист26.Name  находятся в листе excel , макрос должен считывать названия листов из листа справочника.  Думаю, что код должен походить на следующее  
    ThisWorkbook.Worksheets(ThisWorkbook.Worksheets("spr").Range("C1").Value).UsedRange.Address
    Содержимое С1:  Лист26.Name
    Если вместо ThisWorkbook.Worksheets(ThisWorkbook.Worksheets("spr").Range("C1").Value).UsedRange.Address
    Написать  
    ThisWorkbook.Worksheets(Лист26.Name).UsedRange.Address
    То ошибки не возникает, а так пишет “run-time error ‘9’  Subscript out of range”.  Такое ощущение что ThisWorkbook.Worksheets("spr").Range("C1").Value возвращает текст, а там должен быть объект, может есть какая функция, для приведения текста к названию объекта?
    Подскажите плиз, как можно такое реализовать, или есть какие соображения, чтоб обращаться к листам вне зависимости их имени и место нахождения и чтоб их «абсолютные названия» можно было хранить в одном листе справочнике.
     

    Всего записей: 16 | Зарегистр. 30-06-2008 | Отправлено: 11:25 29-08-2008
    nick7inc



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

    Цитата:
    Спасибо, через If код очень длинный будет, у меня 15 значений, а если их 1000!!!

    Сделайте проще, заведите себе специальную вкладку Excel, где в столбцы A и B вбейте все параметры: в A - первый, в B - второй и считывайте их от туда:

    Код:
    For index = 1 To 1000  
     
        arg1=Sheets("Data").cells(index,"A") ' Data - ярлычок (название) листа  
       'с необходимыми параметрами функции InputBox()
        arg2=Sheets("Data").cells(index,"B")
         
        On Error Resume Next  
        iNumber = Application.InputBox(arg1, arg2)  
        If iNumber = 0 Then  
            ...  
        Else:  
            ...
           
        End If  
        Next

     
     
    Добавлено:
    Потом  можно скрыть этот лист от глаз пользователей.

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 14:09 29-08-2008 | Исправлено: nick7inc, 14:24 29-08-2008
    WowGun



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ksodi
    так ЧТО нужно?
    сначало Вы пишите "макрос должен считывать названия листов из листа справочника"
    потом "там должен быть объект"
     
    если нужна ссылка на ОБЪЕКТ, то используется SET
    типа того Set ws = Worksheets(Sheets("spr").Range("C1").Value)

    Всего записей: 109 | Зарегистр. 16-07-2007 | Отправлено: 14:17 29-08-2008
    nopoxz

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, можно ли как-то умешить объём кода:
     

    Код:
     
    Sub Bar1()
     
    'Кусок1
       Range("C5").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
       Else
       Range("B5").Offset(1, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
       Range("B5").Offset(2, 0).EntireRow.Insert
     
     'Кусок2
      ActiveCell.Offset(1, 0).Value = ActiveCell.Value + 1
    ActiveCell.Offset(1, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    ActiveCell.Offset(1, 0).EntireRow.Insert
     
     
    'Кусок3
    ActiveCell.Offset(1, 0).Value = ActiveCell.Value + 1
    ActiveCell.Offset(1, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    ActiveCell.Offset(1, 0).EntireRow.Insert
    ActiveCell.Offset(-10, 0).EntireRow.Hidden = True
     
    End Sub
     

     
    В составе одного Sub Bar1 имею 3 представленных выше "Куска".
    В одном модуле у меня 50 Sub'ов (Bar1...Bar50), где код одинаковый, только меняются значения строк.  
     
    Вопрос можно как-то "Куски" вынести в отдельные процедуры и в Bar'ах просто указывать выполнение "Куска", а не вставлять в каждый Bar, экономя место и время?

    Всего записей: 38 | Зарегистр. 02-07-2008 | Отправлено: 14:23 29-08-2008 | Исправлено: nopoxz, 14:25 29-08-2008
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nopoxz
    А заменить Range("B5").Offset(2, 0) на Cells(Row,Column), тогда можно Range("C5").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
            :=False, Transpose:=False
    в отдельную процедуру вынести, передавая ей только координаты вставки в качестве параметров.
     
    Добавлено:
    Из ActiveCell всегда можно вытащить её абсолютные координаты.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 14:28 29-08-2008
    MaximuS G

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

    Цитата:
    Сделайте проще, заведите себе специальную вкладку Excel, где в столбцы A и B вбейте все параметры: в A - первый, в B - второй и считывайте их от туда:  

     
    Супер, спасибо...
    Скажите еще, если у меня данные начинаються с 7 ряда, то мне приходиться ставить i=7, я думаю есть какая-то возможность написать, что данные считывались с 7го ряда, а i=1, может как-то index+6
     
    А по поводу этого ничего не подскажите:
    Подробнее...

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 15:27 29-08-2008 | Исправлено: MaximuS G, 17:33 29-08-2008
    nopoxz

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc
     
    А можно примерчик или где-то в нете почитать про "в отдельную процедуру вынести, передавая ей только координаты вставки в качестве параметров."

    Всего записей: 38 | Зарегистр. 02-07-2008 | Отправлено: 16:19 29-08-2008
    nick7inc



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

    Цитата:
    есть какая-то возможность написать, что данные считывались с 7го ряда, а i=1, может как-то index+6

    Если во всех случаях у вас данные начинаются с 7го ряда и заканчиваются 1000, то можно написать:
    Код:
    For i=7 to 1000
     
    index+6 лично я бы не стал использовать в данной ситуации: код станет менее наглядным. В других ситуациях может оказаться так, что использовать смещение относительно индекса - единственный оптимальный путь.

    Цитата:
    А по поводу этого ничего не подскажите:

    Увы нет, сам не сталкивался, да и приведённый код (ActiveWorkbook.BreakLink Name:= "..." , Type:=xlExcelLinks) у меня не работает, возможно, что у вас более новая версия Excel.
    nopoxz

    Цитата:
    А можно примерчик

    Что-то вроде того:
    далее
     
    Добавлено:
    Кстати, Cells() допускает использовать как буквенное обозначение колонки, так и индексное (цифровое). Если нужен именно Range(), то его можно сделать из двух Cells().

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 22:53 29-08-2008 | Исправлено: nick7inc, 23:12 29-08-2008
    SAS888

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

    Цитата:
    А по поводу этого ничего не подскажите:

    Попробуй так:

    Код:
    Sub BrLink()
     
        Dim i As Long, x As Variant
        x = ActiveWorkbook.LinkSources
        If Not IsEmpty(x) Then
            For i = 1 To UBound(x)
                ActiveWorkbook.BreakLink Name:=x(i), Type:=xlExcelLinks
            Next i
        End If
     
    End Sub

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 08:34 01-09-2008
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    Спасибо, работает
     
    Добавлено:
    Помогите, плз... не могу чето понять.
    Есть список:  
     
    arg1 = " на 36"
    arg2 = "вариант1 "
    arg3 = "вариант2 "
    arg4 = "вариант3 "
     
    Пытаюсь в цикле получить агрумент функции SaveAs, следующим способом:
     
    ActiveWorkbook.SaveAs ((arg + Cstr(index) + arg1)
    Хотелось бы получить arg2 = (arg+Cstr(index)), если index =2 и т.д... чето не получается
    Тоесть должно получиться "вариант1 на 36", "вариант2 на 36" и т.д.
     
    Спасибо

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 09:30 01-09-2008 | Исправлено: MaximuS G, 14:05 01-09-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MaximuS G
    А нельзя Ваши аргументы (arg1, arg2 и т.д.) организовать в виде массива? Тогда с организацией цикла проблем не будет.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 14:18 01-09-2008
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
     
    Да, наверное, можно )) Только я не знаю как ...
    Буду разбираться ...
     
    Добавлено:
    Если есть возможность, что-нибудь подскажите

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 14:51 01-09-2008
    Klaid1

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите как написать на VBA следующую процедуру:
     
    Есть таблица, в нее добавляется автофильтр в нем выбирается определенное значение и переход на следующий лист. Далее то же самое - вставка автофильтра, выбор, переход на следующий лист.
    Листы должны быть без указания конкретного имени.
     
    Если первую часть можно сделать руками, то как должен выглядеть макрос перехода на следующий лист???
     

    Всего записей: 376 | Зарегистр. 02-09-2008 | Отправлено: 00:30 02-09-2008
    SAS888

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

    Код:
    Sheets(ActiveSheet.Index + 1).Select
    Только следите за тем, чтобы не получилось перехода на несуществующий лист, т.е. следующий за последним.
    Чтобы получить код VBA для создания автофильтра, запустите макрорекордер, проделайте то, что Вам нужно и подправьте полученный код.
    MaximuS G
    Например, что-нибудь в таком виде:

    Код:
    Sub Massiv()
     
        Dim i As Integer, Msg As String, a() As String, arg
    'Исходные данные
        arg = Array(" на 36", "вариант1", "вариант2", "вариант3") ' это псходные данные
        ReDim a(UBound(arg)) 'Определяем размерность массива результатов
    'Формируем требуемые данные в цикле
        For i = 1 To UBound(arg)
            a(i) = arg(i) & arg(0)
        Next
    'Для проверки, выводим полученные значения в окно сообщений
        For i = 1 To UBound(a)
            Msg = Msg & a(i) & vbCrLf
        Next
        MsgBox Msg
     
    End Sub

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 06:10 02-09-2008
    ksodi

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

    Всего записей: 16 | Зарегистр. 30-06-2008 | Отправлено: 14:43 02-09-2008
       

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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 2)
    ShIvADeSt (11-01-2010 10:17): http://forum.ru-board.com/topic.cgi?forum=33&topic=10903


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru