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

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

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

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

   

RUSmafia



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

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

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами 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.
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов

  • Всего записей: 556 | Зарегистр. 31-07-2002 | Отправлено: 21:40 14-10-2004 | Исправлено: lucky_Luk, 20:44 13-04-2007
    Reznikoff

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

    Цитата:
    Так кроме форматов ничего больше из первого во второй лист копировать не надо?  

    Есть таблица. у таблицы все одинаковое (поля, кол-во колонок, оформление. кроме значений).  
    Но название полей в таблице могут менятся. Так вот когда я изменяю таблицу (название, или цвет ячейки) на одном листе, то он так же меняется на другом. При этом значение полей разные.
     
    Выходит что при активации воркшита скрипт изменяет ячейки (цвет, размер), а при изменении тектста ячейки в первом листе, они автоматом меняются во втором (по событию изменения листа, т.к. по этому событию нельзя отловить изменение цвета ячеек).

    Всего записей: 62 | Зарегистр. 18-07-2005 | Отправлено: 04:51 27-11-2006
    The okk



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

    Цитата:
     но тормоза можно словить жуткие.  

    А если попробовать уменьшить тормоза?:
    Выключить обновление экрана (Application.ScreenUpdating = False)
    Не использовать конструкцию For Each, а воспользоваться For Next.
    Сократить диапазон до UsedRange.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:06 27-11-2006 | Исправлено: The okk, 10:12 27-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А вообще, кто какие знает способы, как оптимизировать VBA (v 6.3) код по быстродействию?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:14 27-11-2006 | Исправлено: The okk, 14:15 27-11-2006
    Troitsky



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

    Цитата:
    А вообще, кто какие знает способы, как оптимизировать VBA (v 6.3) код по быстродействию?

    Например, использование массивов может сильно ускорить занесение данных на лист Excel'я.
    В качестве иллюстрации, сравни работу двух процедур (массив 1000x100 заносится в ячейки листа):
    Код:
    Dim intArr(1 To 1000, 1 To 100) As Integer
    Dim i As Integer: Dim j As Integer
     
    Private Sub GenArr()
      Randomize
      For i = 1 To 1000
        For j = 1 To 100
          intArr(i, j) = Fix(Rnd + 0.5)
        Next j
      Next i
    End Sub
     
    Public Sub Variant1()
      GenArr
      Worksheets(1).Cells.Clear
      For i = 1 To 1000
        For j = 1 To 100
          Worksheets(1).Cells(i, j).Value = intArr(i, j)
        Next j
      Next i
    End Sub
     
    Public Sub Variant2()
      GenArr
      Worksheets(1).Cells.Clear
      Worksheets(1).Range(Cells(1, 1), Cells(1000, 100)).Value = intArr
    End Sub
    Второй вариант отработает существенно быстрее.


    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 21:16 27-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Спасибо. И впрямь должно работать быстрее (на 100 000 операций сложения).  
    А почему ты в качестве счетчиков используешь Integer - не в первый раз замечаю. У тебя 16-разрядная ОС?
     
    Добавлено:
    А свои кнопки в меню кто-нибудь создавал? Как тут значок кнопки (свой) сделать?
     
    Добавлено:
    И вот еще вопрос: если делаем цикл от 1 до UsedRange.Rows.Count, будет в каждом цикле опрашиваться это свойство?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 07:41 28-11-2006
    Yuk



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

    Цитата:
    если делаем цикл от 1 до UsedRange.Rows.Count, будет в каждом цикле опрашиваться это свойство?

    Нет, только перед началом цикла. Проверял через пользовательскую функцию.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 09:45 28-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Спасибо!
     
    Добавлено:
    А откуда данные брать быстрее - из переменных или из листа?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 10:04 28-11-2006
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Инженер волнует, я плакал
    Да ничего про Аксессе.

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 13:35 28-11-2006
    Troitsky



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

    Цитата:
    А почему ты в качестве счетчиков используешь Integer - не в первый раз замечаю. У тебя 16-разрядная ОС?
    А при чем тут 16-разрядная ОС? Использование 16-разрядных целых (Integer) чисел просто требует меньше памяти для хранения, чем использование 32-разрядных длинных целых (Long) - два байта в первом случае против четырех во втором.
    Да и если заранее известно, что число не выйдет из диапазона (-32 768;32 767), то зачем его хранить как длинное целое, если вполне можно хранить как целое?

    Цитата:
    А свои кнопки в меню кто-нибудь создавал? Как тут значок кнопки (свой) сделать?
    По поводу кода добавления кнопки есть ссылка в шапке: Добавление в главное меню своего пункта, ассоциированного с макросом.
    Для случая добавления кнопки на панель инструментов код будет отличаться не сильно.
    Сами файлы (графические в формате *.bmp) кнопок должны выгладеть так:
    собственно, сама пиктограмма -  
    и её маска -
     
     
    Добавлено:
    По поводу "выгладеть так", это в качестве примера подобным образом любую пиктограмму можно прикрутить


    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 22:03 28-11-2006
    jONES1979



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    The okk
     
    Конечно из переменных быстрее

    Всего записей: 324 | Зарегистр. 20-05-2005 | Отправлено: 07:40 29-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Спасибо!
    А где-нибудь есть таблица номеров стандартных значков (таблица с изображением значка и его номера)?
     
    А про Integer и 16-разрядные - это я к тому, что 32-разрядные быстрее работают с типом Long. Я поэтому в качестве счетчика и использую этот тип... Ладно, не важно.
     
    И как в Excel показывать/скрывать строки группы (кроме Excel4Macro("Show.Detail")).
     
    Добавлено:
    А. Вот. Нашел.
     
    Добавлено:
    Теперь бы еще найти таблицу всех значков.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:40 29-11-2006 | Исправлено: The okk, 08:42 29-11-2006
    mrnovel

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Счастье было не долгим
     
    Теперь прошу помощи вновь по тому же поводу (http://forum.ru-board.com/topic.cgi?forum=5&topic=19106&start=1040), но теперь содержимое файликов может различаться. Т.е. - в разных файликах могут содержаться разные строки.
    Но: у каждой строки есть свой уникальный идетификационный код который расположен в самом начале - в первом столбце, по ним и следует ориентироваться.
     
    Уважаемый, Yuk, сделай милость - поведай как бы это безобразие изобразить.
     
    Спасибо!

    Всего записей: 65 | Зарегистр. 21-11-2006 | Отправлено: 11:29 29-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Так, со значками тоже разобрался - у Уокенбаха на сайте нашел надстройку.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 11:53 29-11-2006
    Deni005



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Не так давно задавал вопрос попробую его уточнить и сам ответить!
           С  помощью каких действий можно установить такой способ защиты листа «от дурака», при котором ячейки недоступны пользователю, а элементы управления доступны?
     
    В редакторе Visual Basiс удаляем значение свойства LinkedCell, затем на Панели Элементы управления нажимаем кнопку Исходный текст, и в редакторе Visual Basic формируется автоматически процедура обработки события ЭУ_Change:
    Range(“…”).Value = ЭУ.Value
    Защиту «от дурака» устанавливаем с помощью процедуры обработки события Workbook_Open():
     
    ActiveSheet.Protect UserInterfaceOnly:=True

    Всего записей: 742 | Зарегистр. 03-02-2006 | Отправлено: 13:48 29-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот ссылка на надстройку. - Наводишь на значок и тебе выводится его FaceId.  Очень удобно. И рисовать ничего самому не пришлось - все нашел в стандартном наборе.
    Это если кому-то тоже понадобится делать свою панель инструментов.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:54 29-11-2006 | Исправлено: The okk, 13:56 29-11-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrnovel
    Выложи пару файлов для примера.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 18:31 29-11-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Какая из функций листа (читай - экселевских формул) может осуществлять поиск по неотсортированному массиву?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:49 30-11-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    ПОИСКПОЗ для точного совпадения (последний аргумент 0).
    Для неточного только сортировка.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 09:24 30-11-2006
    The okk



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

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 09:34 30-11-2006
    mrnovel

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
     
    Спасибо что откликнулся!
     
    Вот в этом архиве: http://www.appetitnaya-strana.narod.ru/dds2.rar (размер архива 41 Кб, пароль на архив "934934" без кавычек) два файлика экселевских.
     
    В одном из них некоторых строк не хватает.
     
    В итоговой файлике - должны быть просуммированы значения в ячейках, при этом формулы не должны быть модифицированы; а недостающие строки добавлены.
    В качестве идентификатора строки выступает код - он для каждой строки свой.
     
    С твоего позволения позволю себе комментарий: это так называемая аналитическая таблица движения денежных средств - и два файлика которые надо будет просуммировать вот таким экзотическим образом это объединение информации по двум фирмам.
     
    Спасибо ещё раз!

    Всего записей: 65 | Зарегистр. 21-11-2006 | Отправлено: 11:40 30-11-2006
       

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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA
    ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru