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

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Так все таки КОНМЕСЯЦА или КОНЕЦМЕСЯЦА (так у меня в русской справке, самого эксела нет)? Или это от версии зависит?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 17:24 12-07-2006
    Anjin_Kazawa



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Проверить на разных версиях к сожалению не могу, у меня Excel 2003 SP2 и работает так =КОНМЕСЯЦА()

    Всего записей: 392 | Зарегистр. 08-06-2005 | Отправлено: 17:35 12-07-2006 | Исправлено: Anjin_Kazawa, 17:36 12-07-2006
    RobinStone

    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Господа, подскажите пожалуйста новичку:
    1. Как сделать вставку строки с определенными данными, ну или просто вставить новую строку в книгу по нажатию какой-то кнопки на форме (юрез заполняет форму, и потом данные из нее вставляются в новую строку)
    2. Как элементу список, на форме задать массив значений из определенного диапозона
    3. Как скрыть определенный Лист в списке листов...
     
     
    Заранее спасибо

    Всего записей: 14 | Зарегистр. 27-06-2006 | Отправлено: 05:06 13-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RobinStone
    1. Форма откуда? Самодельная? При вставке строки надо раздвигать строки? Если да, то используется, например,
    Код:
    Range("A5:B5").Insert Shift:=xlDown
    Затем заполняются ячейки, например:
    Код:
    Range("A5").Value=Textbox1.Value

     
    2. Использовать свойство ListFillRange списка.
     
    3. Формат - Лист - Спрятать

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

    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Да, форма самодельная.
    Спасибо за информацию - буду пробывать
     
    А в это свойство что пишется (ListFillRange)?
    Т.е. я открываю свойства объекта, нахожу это свойство, пишу в него например A5:A15 и он в нем будет показывать список из этих ячеек?
     
    Добавлено:
    И еще небольшой вопросик
    как можно в отдельно взятой книге, желательно при помощи VBA
    при загрузке убрать все меню и вставить свои?
     
    Добавлено:

    Цитата:
    3. Формат - Лист - Спрятать

    А средствами VBA?
    Мне надо чтобы при запуске приложения все листы были спрятаны, а при нажатии на кнопочки (макросы) нужные листы открывались
     
     
     
    Добавлено:
    Ой... уже сам нашел:
    Sheets("Имя_Листа").Visible = True/False
    ))

    Всего записей: 14 | Зарегистр. 27-06-2006 | Отправлено: 09:46 13-07-2006
    Yuk



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

    Цитата:
    Т.е. я открываю свойства объекта, нахожу это свойство, пишу в него например A5:A15 и он в нем будет показывать список из этих ячеек?
    Именно так. Адресация такая же, что и для формул. Или можно перечислить величины через запятую.
     

    Цитата:
    при загрузке убрать все меню и вставить свои

    Надо работать с коллекцией CommandBars. Можно найти много примеров в гугле. Чтобы меню изменялось при открытии книги, сделать макросы Auto_Open и Auto_Close для восстановления. Только я не думаю, что изменение меню не повлияет на весь эксель.

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

    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    ну... на весь эксель пусть влияет
    я же могу при закрытии книги вернуть все как было

    Всего записей: 14 | Зарегистр. 27-06-2006 | Отправлено: 10:29 13-07-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Это опять я, со своими идеями.
    Мысль следующая: Есть некий шаблон, куда вносятся данные. В нем несколько строк (10) и столбцов 4. Задача: как сделать так чтобы заполнять последующу строчку можно было после заполнения предыдущей. Т.е. если заполнил строку 1 то достпной для ввода становится строка 2 и т.д.
    Сейчас я сделал пассивну защиту через условное форматирование - т.е. если предыдущая строка не заполнена, то в текущей в ячейка цвет шрифта  = цвету заливки. (белый = белому). Т.е. сейчас данный можно внести в любую ячейку, но они отображаться не будут. Но юзвери этого не поймут.

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 13:29 13-07-2006
    RobinStone

    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Можно попробывать сделать через защиту ячеек
    Т.е. делаешь все ячейки кроме первой защищенными и запрещаешь изменение или вообще даже выделение. Потом по событию OnCange. смотришь, если была изменена первая ячейка - разблокируешь вторую и т.д.
     
    Либо просто по событию OnCange проверяешь все ячейки, если например первая незаполнена, а заполнили вторую, стираешь и ставишь фокус на первую

    Всего записей: 14 | Зарегистр. 27-06-2006 | Отправлено: 13:36 13-07-2006
    sk4Nk

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем добрый день. Необходим макрос который будет вырезать первые 12 символов из ячейки, например значение в ячейке: 01.01.1900  0:23:12, необходимо привести к виду: 0:23:12, т.е. убрать первые 12 символов. Заранне спасибо за помощь.

    Всего записей: 5 | Зарегистр. 11-07-2006 | Отправлено: 14:59 13-07-2006
    Anjin_Kazawa



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

    Цитата:
    Всем добрый день. Необходим макрос который будет вырезать первые 12 символов из ячейки, например значение в ячейке: 01.01.1900  0:23:12, необходимо привести к виду: 0:23:12, т.е. убрать первые 12 символов. Заранне спасибо за помощь.

    Зачем в такой ситуации макрос? Если можно просто формулами разрулить

    Код:
    =ПОДСТАВИТЬ(B2;ЛЕВСИМВ(B2;12);"")

    Или есть ещё какие-то условия?

    Всего записей: 392 | Зарегистр. 08-06-2005 | Отправлено: 15:55 13-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sk4Nk
    Если макрос, то, например, так
    Код:
    Selection.Value=Mid(Selection.Value,13)

     
     
    Добавлено:
    RobinStone

    Цитата:
    Либо просто по событию OnCange проверяешь все ячейки, если например первая незаполнена, а заполнили вторую, стираешь и ставишь фокус на первую
    Очень недружелюбный вариант по отношению к юзеру.

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Все дело в том что эксель представляет время как число, например 0:12:32 будет как 0,4625394...и воспользоваться функцией LEFT не удастся....

    Всего записей: 5 | Зарегистр. 11-07-2006 | Отправлено: 09:34 14-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sk4Nk
    Тогда так и надо писать, что это дата. Тут вариантов уйма. Если просто надо показать время, можно обойтись одним форматированием. Если нужно "откусить" время", подойдет например =MOD(B2,1), естественно с соответствующим форматированием.  
    Если нужен текст =TEXT(B2,"hh:mm:ss").

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



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

    Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 09:19 15-07-2006 | Исправлено: DeadVillage, 11:14 16-07-2006
    Denis_Kokyev



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Что-то  никак  не  могу  разобраться  с  этим VBA, не может же он быть
    сложнее  чем  pascal  и autoit (этот то вобще практически vba в чистом
    виде).  Прочел  уже  всю  ветку  ветку,  скачал  из  шапки  корявый  и
    непоследовательный  help,  нашёл  книжку "VBA для чайников" (5 mb). От
    последнего  вообще  в голове каша. Многие вещи прояснились, но многоие
    так  и  остались  для  меня  загадкой. Логика построения что-то мне не
    даётся...
     
    Вот, например, простая задача:
    Приходит прайс, надо чтоб при нажатии кнопки, строчка на которой стоит
    курсор,  копировалсь  бы,  например,  на лист 3, там подсчитывалась бы
    сумма, потом происходил бы возврат на лист 1 и снималось бы выделение.
    При  следующем нажатии клавиши макроса - строка бы вставлялась бы ниже
    предыдущей.  В  итоге  на  листе 3 сформировался бы список необходимых
    товаров с просчитанной суммой.
     

    Код:
    Sub Макрос3()
    '
    ' Макрос записан 14.07.2006 (Denchik)
    '
     
    '
     
        Sheets("Лист1").Select
        Range(Selection, Selection.End(xlToRight)).Select
        Selection.Copy
        Sheets("Лист3").Select
        ActiveSheet.Paste
        SendKeys "{Down}"
     '   Sheets("Лист1").Select
     '   SendKeys "{ESC}"
    End Sub
     

     
    Вот  этот  код  вроде бы практически работает - строчки копируются, но
    если  раскоментировать  две  последние  строчки, сдвиг на строчку вниз
    (чтоб  при  нажатии на кнопку макроса строчка с товаром вставлялась бы
    после  предидущей)  почему-то  применяется  к  первому  листу. Пытался
    сделать  проверку,  чтоб  в 3 лист строчка вставлялась в первую пустую
    строчку - вообще ничего не получилось. После попытки вставки на 3 лист
    шапки типа "Список Товаров" и подсчёта суммы где-то сбоку (просто тупо
    =СУММ(E1:E2000)) - вообще мрак выходит. Комманда SendKeys ("^+{LEFT}")
    то же странно срабатывает - то всю строчку выделяет, то одну ячейку...
    Короче, в голове полная каша!
     
    Помогите плиз...
     
    Добавлено:
    Пока  нет  ответов,  скачал "Профессиональное програмирование на VBA в
    Excel 2002"(8 mb) - изучаю со скрипом... Кстати, из шапки help закачал
    Offline  Explorer'ом  -  сформировал  .exe  файл - может вылодить куда
    нибудь? Менее 900 Kb получилось.
     


    ----------
    Можно ответить на любой вопрос, если вопрос задан правильно.
    Платон

    Всего записей: 1074 | Зарегистр. 24-02-2003 | Отправлено: 14:51 15-07-2006 | Исправлено: Denis_Kokyev, 01:40 16-07-2006
    Yuk



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

    Цитата:
    и не залезая в VBA

    Не совсем понятно, что мы тогда делаем в форуме по VBA?
     
    Denis_Kokyev
    Мне нравится твой подход. Добивай этот VBA и все у тебя получится.
     
    Макрос на VBA - это не совсем воспроизведение твоих действий. Надо разобраться в объектной модели экселя.
    Попробуй во такой код:

    Код:
    Sub test()
        Range(Selection.End(xlToLeft), Selection.End(xlToRight)).Copy ' копируем
        Sheets("Лист3").Activate
        ActiveSheet.Paste
        r = Selection.Row ' номер текущей строки
        c1 = Selection.End(xlToLeft).Column ' номер первого столбца
        cend = Selection.End(xlToRight).Column ' номер последнего столбца
        Cells(r, cend + 1).Value = WorksheetFunction.Sum(Range(Cells(r, c1), Cells(r, cend))) ' считаем сумму
        Cells(r + 1, c1).Select ' на следующую строку
        Sheets("Лист1").Activate
        Application.CutCopyMode = False ' Снимаем выделение
    End Sub


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 10:01 16-07-2006
    Denis_Kokyev



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Yuk
    Спасибо за помощь! Я сейчас нахожусь в состоянии культурного шока от
    VBA. Победить бы его быстрее...
    Вот чутка переделал Ваш код (чтоб сумма считалать по одной колонке, и
    вставлялась в одну ячейку):

    Код:
     
        Sub test()
        Range(Selection.End(xlToLeft), Selection.End(xlToRight)).Copy ' копируем
        Sheets("Лист3").Activate
        ActiveSheet.Paste
        r = Selection.Row ' номер текущей строки
        c1 = Selection.End(xlToLeft).Column ' номер первого столбца
        cend = Selection.End(xlToRight).Column ' номер последнего столбца
        Cells(1, cend+1).Value = WorksheetFunction.Sum(Range(Cells(1, cend), Cells(r, cend))) ' считаем сумму
        Cells(r + 1, c1).Select ' на следующую строку
        Sheets("Лист1").Activate
        Application.CutCopyMode = False ' Снимаем выделение
    End Sub
     

     
    Что пока приводит в замешательство:
    1.  Копируется не вся строчка, а только до первой пустой. Где-то читал
    про это, но в какой книге - найти несколько часов не могу.
    2. Как получить последнюю строчку по вертикали - так же, читал, но
    пока опять же - не найти. Потому просто тупо поставил считать первые
    несколько строчек или по переменной r.
     
    3. Если первые два пункта я ещё теоретически могу понять, то что
    происходит с подсчётом суммы - я вообще не могу осилить. Уж по разному
    пытался, но...
    Вот пример (по трём строчкам):

    Цитата:
     
    Карта памяти    Transcend       Multi Media     128Mb   366
    Карта памяти    Transcend       Multi Media     256Mb   497
    Карта памяти    Transcend       Multi Media     512Mb   897
     

    Суммы после добавления каждой строчки: 366, 863,15,  1759,85
    Откуда берутся дробные части при сложении целых чисел?  

    Всего записей: 1074 | Зарегистр. 24-02-2003 | Отправлено: 17:01 16-07-2006 | Исправлено: Denis_Kokyev, 18:03 16-07-2006
    SERGE_BLIZNUK

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

    Цитата:
    Суммы после добавления каждой строчки: 366, 863,15,  1759,85  
    Откуда берутся дробные части при сложении целых чисел?

    выдели в исходной странице столбец с числами, выбери формат ячейки, поставь числовой и количество знаков после запятой побольше (ну хотя бы два знака после запятой). наверняка увидишь дробные части... ;-))
     
    Добавлено:

    Цитата:
    2. Как получить последнюю строчку по вертикали  

    вариантов наверняка много... попробуй так...
     
    MaxRow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 06:47 17-07-2006
    Yuk



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

    Цитата:
    1.  Копируется не вся строчка, а только до первой пустой.

    Это свойство End. Для всей строчки используй Selection.EntireRow.

    Цитата:
    2. Как получить последнюю строчку по вертикали
    А чем тебе не нравится переменная r? Можно также использовать End(xlDown) или UsedRange. А вот откуда начинать суммирование ты решил? Всегда с первой строчки? Или с End(xlUp)?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 08:07 17-07-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