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

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    По моему примеру:
    Есть нечто такое  
    1010    x    1348    1600    x    1936    630  
    x    1094    1348    x    1684    1936    x  
    1010    x    1348    1600    x    2002    630  
    x    1094    1348    x    1748    2050    x  
     
     
     
    Должно остаться следующее
    1010    1094    1348    1600    1684    1936    630  
    1010    1094    1348    1600    1748    2002    630  
    Группируються все одинаковые строчки. х - это *, то есть может заменять собой любую цифру.
     
    В ситуациях типа
    700 х
    х     800
    701 х
    Вторая строчка подходит по шаблону и к первой и к третьей строчки, но первая и третья не совпадают. Тогда береться в порядке сортировки. Например сверху вниз, тогда получаеться:
    700 800
    701 х

    Всего записей: 539 | Зарегистр. 04-07-2002 | Отправлено: 22:06 19-09-2006
    PavelO

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо, Yuk, ты наверное не одну книгу перелопатил. Дай пожалуйста ссылку на книгу, в которой описаны подобные приемы, или намыль opa-pavel@yandex.ru. (как тебе будет удобнее вообщем). А то если написать здесь все вопросы, которые меня интерисуют на серваке места не останется )

    Всего записей: 27 | Зарегистр. 19-09-2006 | Отправлено: 23:06 19-09-2006
    SERGE_BLIZNUK

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

    Цитата:
    1010    x    1348    1600    x    2002    630  
        x    1094    1348    x    1748    2050    x  
     
    Должно остаться следующее  
    1010    1094    1348    1600    1684    1936    630  
    1010    1094    1348    1600    1748    2002    630  

    а куда делось 2050 в предпоследней колонке (см.последнюю строку примера)?!
     
    нет - извините меня за возможно поданную вам надежду, но я не пойму что и как вы хотите сделать - по какому признаку проставляются x (если это числа), по каким колонкам идёт свёртка...
     

    Цитата:
    Вторая строчка подходит по шаблону  

    что такое "шаблон" в данном случае и как он задаётся?
     
    бр-р-р-р... Ума не приложу, кому и зачем нужно решение подобной задачи...
    или я всё таки туплю и чего-то не понимаю...
     
     
     
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 23:54 19-09-2006
    Yuk



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

    Цитата:
    Дай пожалуйста ссылку на книгу, в которой описаны подобные приемы

    Ты не поверишь: хелп + гугл
     
     
    Добавлено:
    Xttx
    Согласен, задача не из простых. Имеет ли значение текущий порядок строк или надо проверить все пары? Другими словами, тебе нужно наилучшее совпадение пар строк или совпадение ближайших строк, принимая во внимание их текущий порядок?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 00:15 20-09-2006
    PavelO

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk, а если задачку посложнее (ну для меня она конечно и вовсе нерешимая):
    Хотел вставить в мою форму сто image'ов (ну это не проблемма, а вот вставить рисунки), а эти рисунки храняться в одной папке и имена их 10048.jpg, 11123.jpg, 10156.jpg и т.д
    Но вставить их нужно только определенное количество, а оно определяется списком, который находится на втором листе, но каждая ячейка имеет строку примерно такую:
    "Рисунок 10048 весит 30Кб", "Рисунок 11123 весит 50Кб", "Рисунок 10156 весит 24Кб" и т.д. Как бы мне вставить только те рисунки из этой папки, упоминание о которых есть в списке на втором листе? Во как.

    Всего записей: 27 | Зарегистр. 19-09-2006 | Отправлено: 02:28 20-09-2006
    Yuk



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

    Код:
    Sub test()
    Dim arr As Variant
    For i = 1 To 3
        arr = Split(Cells(i, 1).Text, " ")
        imgname = arr(1) & ".jpg"
        Debug.Print imgname
    Next i
    End Sub

    Предполагается, что строки в области А1:А3, которую в принципе можно определить динамически (For i = 1 To UsedRange.Rows.Count).  
    Вместо строки с Debug.Print используй код для вставки картинки в форму.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 09:26 20-09-2006
    Xttx



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    Прости пожалуйсто. Извиняюсь за ошибку, конечно из:
    1010    x    1348    1600    x    1936    630  
    x    1094    1348    x    1684    1936    x  
    1010    x    1348    1600    x    2002    630  
    x    1094    1348    x    1748    2050    x  
     
    Должно получиться
    1010    1094   1348    1600    1684    1936    630  
    1010    x        1348    1600    x          2002    630  
    x    1094        1348    x         1748    2050    x  
     
     
     
    Добавлено:
    Yuk
    Cовпадения ближайших строк будет достаточно.

    Всего записей: 539 | Зарегистр. 04-07-2002 | Отправлено: 10:51 20-09-2006 | Исправлено: Xttx, 10:52 20-09-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Xttx
    Попробуй вот такой макрос:
    Подробнее...
    Данные должны начинаться с А1 (можно позже исправить).
    Проверяются только соседние строки и только попарно. То есть 3 одинаковые строки уже не определит, но можно запустить макрос опять.
    Результат копируется во 2-й лист.
    Если не работает или работает не правильно, пришли данные, на которых тестировал.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 10:11 21-09-2006 | Исправлено: Yuk, 10:15 21-09-2006
    AltM

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день.
     
    Подскажите, пожалуйста, непрофессионалу как организовать следующее:
     
    При открытии файла хочется иметь возможность одновременно изменять параметры в ячейке и нажать на кнопку (в поле страницы), которая бы вызвала выполнение макроса (программки).
    Кнопка должна всегда быть видна на данной странице
    Я попробовал сделать следующее (на вкладке "Эта книга"):
     
    Private Sub Workbook_Open()
      Worksheets("Interface").Activate ' activating interface worksheet
      UserForm1.Show
    End Sub
     
    При этом "кнопка" выводится на страницу при открытии книги, но альтернатива только одна - на кнопку нажать и вызвать макрос (ну UserForm еще можно "крестиком" закрыть). А вот получить возможность одновременно и ячейки редактировать и на кнопку нажимать я не знаю как.
     
    Спрасибо заранее если кто поможет

    Всего записей: 2 | Зарегистр. 21-09-2006 | Отправлено: 19:22 21-09-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AltM
    Нет проблем. Правый клик по панели с кнопками и выбрать Control Toolbox (или как там в русском экселе). Откроется панель с набором контролей как для создания формы. ВЫбирай кнопку и рисуй прямо на листе. Двойным кликом по новой кнопке попадешь в ее код.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:39 21-09-2006
    AltM

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

    Всего записей: 2 | Зарегистр. 21-09-2006 | Отправлено: 10:27 22-09-2006
    Dr Eam

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я вот тут в сообщении http://forum.ru-board.com/topic.cgi?forum=33&topic=3961&start=640#2 жаловался на проблему, так я нашёл её решение.
    На случай, если у кого что-нибудь возникнет подобное, напишу решение.
    Прописывание перед каждой ячейкой/диапазоном листа не помогает. Лучше это не делать, а прописывать его в With:
     

    Цитата:
        With Sheets("Накладная")
            Range(Cells(25, 1), Cells(24 + rows, 2)).HorizontalAlignment = xlLeft
     

     
    Всё работает без глюков.
     
    Напомню, что у меня глюки появляются только при применении форматирования, если же просто вписывать данные в ячейки, то всё работает нормально.
     
    Добавлено:
    Или же всё дело в том, что я прописывал префиксно "Worksheet", а нужно просто "Sheet"?
    _______________________________________
     
    Добавлено:
    А я могу одной строкой поставить внешнюю рамку диапазона?
    В более других языках я бы написал что-то вроде
    ля-ля.Borders(xlEdgeBottom | xlEdgeTop | xlEdgeLeft | xlEdgeRight).ля-ля
    Пробовал здесь писать Or вместо символа | - не срабатывает.

    Всего записей: 226 | Зарегистр. 20-12-2005 | Отправлено: 10:36 22-09-2006 | Исправлено: Dr Eam, 16:06 22-09-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Dr Eam
    Код не верный (если скопирован точно). Нет точки перед Cells. Посмотри хелп по With statement.
    Этот код будет работать, но без учета With. Области будут использоваться из активного листа, а не из листа "Накладная". Пробовал сменить активный лист? Или твой лист активируется где-то в коде?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 17:13 22-09-2006
    Dr Eam

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

    Всего записей: 226 | Зарегистр. 20-12-2005 | Отправлено: 17:20 22-09-2006
    Yuk



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

    Цитата:
    А я могу одной строкой поставить внешнюю рамку диапазона?
    В более других языках я бы написал что-то вроде
    ля-ля.Borders(xlEdgeBottom | xlEdgeTop | xlEdgeLeft | xlEdgeRight).ля-ля
    Пробовал здесь писать Or вместо символа | - не срабатывает.  

    Borders - это коллекция (Collection) объектов Border. А xlEdgeBottom и т.д. всего навсего константы, означающие индекс объекта - целое число. | не сработает, здесь нет логических/битовых значений. Только по объектам.
     
     
    Добавлено:

    Цитата:
    Или же всё дело в том, что я прописывал префиксно "Worksheet", а нужно просто "Sheet"?

    Sheets и Worksheets отличаются только тем, что в Sheets включаются также листы с диаграммами. При доступе к листу через его имя разницы никакой разве что Sheets короче.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 17:20 22-09-2006 | Исправлено: Yuk, 18:46 22-09-2006
    Troitsky



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

    Цитата:
    А я могу одной строкой поставить внешнюю рамку диапазона?

    ну, например, вот так
    Код:
    Range("B3:H6").BorderAround xlContinuous, xlMedium, xlColorIndexAutomatic
    константы вид рамки можно менять - глянь в Object Browser и поэкспериментируй.

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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 19:42 22-09-2006 | Исправлено: Troitsky, 19:44 22-09-2006
    sword12

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Защита ячеек в Exel-документе(для начинающих в VBA)
     
     
     Часто при написании небольших програмок для инженерных расчетов в Екселе (формулы в ячейках), встает проблема по защите содержания ячеек от случайных измененний.При этом стандартные способы Exsel по защите листа фактически сводят на ноль всю прелесть пользования своей "эксклюзивной программой"(возможно в лецензионном Ofis ситуация иначе).
    Програмист я некудышный, но после долгих и нерегулярных изучений путанно-высокомерно-непонятной литературы по прграммированию сваял такой фрагмент:
     
    В начале пишем в Екселе (например на Лист1) свою программу с расчетами, формулами, коментариями, ну и прочим оформлениями и прелестями.
     
    Далее: Сервис - Макрос - Создать... Создаем допустим макрос под названием w2
     
    Выпадает окно VBasic , где:
     
    В  модуле1 автоматически создается запись для  макроса w2, если нет, то напишите сами (в смысле вписать w2)
     
    Sub w2()
     
    End Sub
     
     Далее на Лист1 (например) пишем следующий фрагмент кода, где указываем ячейки в каких можно и необходимо вводить данные.В зависимости от ввода единичной ячейки или диапазона, используют соответственно знак , либо :  и так далее, все остальные ячеки листа в дальнейшем будут недоступны для редактирования.
    Пример:
     
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Range("B1:D1,B10:D10,B20:D20,С25").Select            ' перечень ячеек для ввода
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Range("B1:D1,B10:D10,B20:D20,С25").Select            ' перечень ячеек для ввода
    End Sub
     
     
     
                       Все, далее запуск, сохранить и пользуйся.
     
     
    После вызова соответств. книги Ексель открывается лист вашей программы, щелкните где угодно, соответств. ячейки окрасятся в цвет выделения и активизируется первая ячейка по списку. Перемещение по ним - кнопка Тав., убрать все выделения - стрелочка внизу экрана справа (выбор объекта) например для распечатки. Ввод при этом возможен только в выделенные ячейки посредством клавиатуры с перемещения по ячейкам с помощью кнопки Таб, мышь при этом ничего не может изменить,я конечно не исследовал изощреных способов.
     
    p.s. неудобства - после ввода данных в одну ячейку приходится к следующей переходить снова с      первой ячейке посредством кнопки Таб.Для возможных исправлений в ячейках с формулами документе снова войдите на VBasic и поставьте апостроф перед оператором строки с Range... вот так 'Range ..., после изменений все вернуть назад.  
     
                        Все ...                                    2006

    Всего записей: 2 | Зарегистр. 22-09-2006 | Отправлено: 02:17 23-09-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
     
    sword12
    Это твое произведение или скопировал откуда? Нет, мне просто интересно, кто-нибудь пробовал понять или воспроизвести сие?

    Цитата:
    возможно в лецензионном Ofis ситуация иначе

    Если тебя действительно интересует данная проблема, можно сделать все нормально. Или цель была запостить что-нибудь?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 05:34 23-09-2006
    sword12

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Во! я оказался прав.
    Да нет, этого вы нигде не найдете, по сути две взаимо-исключающие инструкции.
    В свое время я через эту "защиту" ячеек с одновременной возможностью ввода данных изрядно покувыркался. Перечитал неодну книгу по этому VBA, ненашел, во всяком случае в тех чо читал.
     
    А теперь без обиды, знаете, вот смотрю я в интернет, черт, да полно умного народу, но вот у меня на работе...., ну некого спросить, а коллектив то 650 человек, из них, 300 сидит у компов.
     
    Конечно я уверен что способ есть, подскажи...
     
     
     
    Добавлено:
    With Worksheets(1)    .EnableSelection = xlNoRestrictions  -  это оно?
     
    Добавлено:
    Все, подсказки не надо, уже нашел.
     
    Мое вам уважение!!!

    Всего записей: 2 | Зарегистр. 22-09-2006 | Отправлено: 02:04 24-09-2006
    Dr Eam

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    А стоит только поставить префиксные точки в With-блоке, как сразу начинаются всё те же рантайм-ошибки.

    Всего записей: 226 | Зарегистр. 20-12-2005 | Отправлено: 12:05 25-09-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