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

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



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ну то, что не програмер и так понятно.
    Просьба с синтаксисом подсказать
     
    Dim cur_range As Range
        With ActiveSheet
            Set cur_range = Selection
            cur_range.Activate
                If здесь надо сравнить содержимое двух ячеек, заданных относительно акт. ячейки [R - 5] < [R - 4] Then
                    With cur_range.Interior
                        .ColorIndex = 6
                        .Pattern = xlSolid
                    End With
                End If
                 
                     
        End With
     
    как произвести операции со значениями неактивных ячеек????
    Или может куда отправите почитать на эту тему. В форуме рылся нифига не нашел(((

    Всего записей: 8 | Зарегистр. 13-10-2006 | Отправлено: 12:51 16-10-2006
    Troitsky



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

    Код:
    If .[R[-5]C].Value < .[R[-4]C].Value Then

    Это что ли тебя интересует?
     
    Добавлено:
    Ну или вот так:
    Код:
      With ActiveCell
        If Cells(.Row - 5, .Column).Value < Cells(.Row - 4, .Column) Then
          .Interior.ColorIndex = 6
          .Interior.Pattern = xlSolid
        End If
      End With


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 13:13 16-10-2006
    Sk1f



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    http://www.script-coding.info/VBA_First_Steps.zip

    Цитата:
     
    CHM-файл справки с тремя учебниками по VBA, "VBA для Excel" (73 шага), "VBA для Access" (34 шага) и "Справка VBA" (93 шага) на русском языке. В файле справки имеется полнотекстовый поиск. Материалы файла являются Off-line версией материалов сайта "Первые шаги" (по состоянию на 11.10.2006). Автор учебников - Каев Артем Геннадьевич.
     
    Примечание: данный файл размещён здесь с согласия Web-мастера ресурса "Первые шаги".
     

     
    //взято с сайта http://www.script-coding.info/filez.html

    Всего записей: 198 | Зарегистр. 04-04-2006 | Отправлено: 13:50 16-10-2006
    DoubleZero



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
     
     
    Отлично и так и этак. Все супер, сенкс.
    Тока вот проблема, цвет заливки активной ячейки не меняется.
    Независимо выполняется условие или нет
     
    Sk1f
     
    уже залез и качаю, тоже сенкс.

    Всего записей: 8 | Зарегистр. 13-10-2006 | Отправлено: 15:52 16-10-2006
    Troitsky



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

    Цитата:
     цвет заливки активной ячейки не меняется

    Ну попробуй тогда сделать не через индекс цвета, а через сам цвет:
    Код:
          .Interior.Color = vbYellow


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 16:29 16-10-2006
    DoubleZero



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    То Troitsky
     
    Пробовал, через раз шлепает.
     
    Вообще к чему я это все, у меня процедура вычисляет формулу для выделенного диапазона. Все пучком. Но так как у меня там будет масса условий, то я хотел их разнести через If then? но тут косяк, может она туго понимает эту относительную адресацию???
     
    Процедура вот такая
     
    Dim cur_range As Range
        With ActiveSheet
            Set cur_range = Selection
            cur_range.Activate
         
            cur_range.FormulaR1C1 = "= IF(RC[-5]<RC[-4],IF(RC[-5]<RC[-2],RC[-3]*1.1,""Условие не выполнено""),FALSE)"
     
        End With
     
    Вот такой вини-грет

    Всего записей: 8 | Зарегистр. 13-10-2006 | Отправлено: 17:46 16-10-2006
    Troitsky



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

    Цитата:
    Вот такой вини-грет

    Действительно винегрет
     
    Ты чего хочешь то? Составить условия для макроса или в ячейку макросом функции записывать, которые не VBA будет вычислять, а непосредственно Excel?


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 18:38 16-10-2006
    DoubleZero



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Да нет я конечно хочу, что бы все вычисления происходили в VBA, там все более прозрачно можно написать, а не этими длинными строками.  
     
    А фигня такая получилась, потому как сделал просто, написал условие в макросе и затем зашел в VBA для корректировки.
     
    Если просветишь как это условие разбить на составляющие буду очень признателен

    Всего записей: 8 | Зарегистр. 13-10-2006 | Отправлено: 09:42 17-10-2006
    Troitsky



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    DoubleZero
    Короче, как я понял: ты выделяешь диапазон ячеек и желаешь, что бы каждая ячейка из этого диапазона, для которой выполняется условие
    [RC[-5]] < [RC[-4]]
    и
    [RC[-5]] < [RC[-2]]
    заливалась желтым цветом.
    Если так, то код такой:
    Код:
      For Each anyCell In Selection.Cells
         
        With anyCell
          If Cells(.Row, .Column - 5).Value < Cells(.Row, .Column - 4) Then
            If Cells(.Row, .Column - 5).Value < Cells(.Row, .Column - 2) Then
              .Interior.Color = vbYellow
            End If
          End If
        End With
         
      Next anyCell

     
    Или все таки желаешь, что бы логика соответствовала формуле
    Код:
    = IF(RC[-5]<RC[-4],IF(RC[-5]<RC[-2],RC[-3]*1.1,""Условие не выполнено""),FALSE)
    ?
     
    Распиши подробнее что имеешь и что желаешь получить в результате каких действий.


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 21:09 17-10-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Небольшой комент:
    Cells(.Row, .Column - 5).Value можно заменить на .Offset(0,-5).Value
     
    Дело вкуса, конечно.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 21:29 17-10-2006
    Troitsky



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

    Цитата:
    Небольшой комент:  
    Cells(.Row, .Column - 5).Value можно заменить на .Offset(0,-5).Value

    Вариант, естественно, не один - была бы задача сформулирована четко, а уж реализации можно весьма разнообразные представить

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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 22:35 17-10-2006 | Исправлено: Troitsky, 22:35 17-10-2006
    Sk1f



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Посоветуйте книги по VBA EXCEL - в продаже.
     

    Всего записей: 198 | Зарегистр. 04-04-2006 | Отправлено: 14:05 20-10-2006 | Исправлено: Sk1f, 14:21 20-10-2006
    Pantera3587

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    помогите написать код!!! я только учусь писать макросы.
    допустим, есть на одном листе таблица, занимающая диапазон A:F. в этом диапазоне записываются какие-то данные, но в первом столбце могут записыватся одинаковые числа. нужно, чтобы на другой лист копировались все  данные, у которых числа в первом столбце одинаковы. Этот код должен выполняться после внесения числа из первого столбца в окно сообщения InputBox

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 20:36 20-10-2006 | Исправлено: Pantera3587, 20:57 20-10-2006
    Yuk



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

    Код:
    Sub test()
    res = InputBox("Enter number:")
    nr = Sheets(1).UsedRange.Rows.Count
    Sheets(2).UsedRange.Clear
    j = 1
    For i = 1 To nr
        If Cells(i, 1) = CInt(res) Then
            For c = 1 To 6
                Sheets(2).Cells(j, c).Value = _
                Sheets(1).Cells(i, c).Value
            Next c
        j = j + 1
        End If
    Next i
    End Sub

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот такие есть вопросы (может кто знает):
    1. Как программно сохранить книгу(т.е. чтобы она не спрашивала:"Сохранить документ? Да?Нет?"). Возможно не сохранить, но обойти этот вопрос так, чтобы изменения в книге сохранились???
    2. Как ускорить быстродействие программы (а то она слишком тормозит сильно, т.к. в ней постоянно сравниваются каждая ячейка одного столбца с каждой ячейкой другого столбца в основном через for-next, бывает for each-next и встречается do-while с различными условиями: if instr...then, if eto = to then)???. вообщем долго машина думает.

    Всего записей: 27 | Зарегистр. 19-09-2006 | Отправлено: 18:08 22-10-2006
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    PavelO
    Чтобы сохранить  
    Activeworkbook.Save
    Чтобы не спрашивал
    Activeworkbook.Saved = True
    после чего закрыть без вопросов
    Activeworkbook.Close

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 21:16 22-10-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    PavelO
    1. Ты имеешь ввиду при закрытии книги сохранять ее, не спрашивая пользователя? Для конкретной книги или для всех (последнее я лично не стал бы делать)? Если так, используй событие Workbook_BeforeClose и метод ActiveWorkbook.SaveAs
     
    2. Программа в модуле или это обработчик событий?  
    Можно попробовать ограничить область, где сравниваются ячейки. Попробовать оптимизировать сравнение. Не видя кода сложно сказать.  
    Также попробуй вставить в начало кода:
    Код:
     Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False

    и в конец:
    Код:
     Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
     


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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Все. Сделал (Делал на ексель 2003, ВинХР). Всю прогу. У меня она работала. Принес к подруге показать (У нее ексель 2000, Вин98се). И ошибки поперли. Пишет что-то типа: "Compile error in hiden module Лист1". Нет ну понятно, что там все начиналось с кнопки, которая распологалась на Листе1, и от нее то ошибки и пошли. Полез разбираться. Ну некоторые переменные не обазвал - исправил, далее вба мне стал выделять такие операторы, как mid,left,ltrim, ссылаясь на ошибку. Видимо что-то со стрингами, обазваk переменную стрингом, она же используется в:For each c in worksheets("List1").range("A1:A200"), далее if mid(c.value, 3,5)>0 then .....
    Почему у меня все работало, а у нее перестало??? Понятно, что разница версий, но всеже почему???

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



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Доброго времени суток!
    Надо было сравнить пару текстовый файлов с данными (В каждом файле 4 колонки через запятую. В конце строки пусто. Но сравнить надобно только первую колонку). Думал быстренько открыть в Экселе да и сравнить колонки из разных файлов. Да нарвался на проблему - файлы длинноваты, а в Экселе максимум 65536 строк всасывает. А в файле данные раза в 4 этот максимум перекрывают. Разорвать текстовый файл на куски и втянуть покусочно в отдельную колонку. Но ведь не разовая задача и геморойно.
    А вопрос такой - может ли Эксель, открывая слишком длинный столбец данных, размещать это дело самостоятельно в нескольких последовательных колонках? Или это токма макросами делать надо?


    проблему решил своеобразно - с помощью программульки WinMerge.

    Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 02:10 23-10-2006 | Исправлено: DeadVillage, 04:50 23-10-2006
    SERGE_BLIZNUK

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

    Цитата:
    сравнить пару текстовых файлов с данными  

    1) что значит - сравнить?.. выбрать строчки, которые отличаются? Или которые одинаковы? Или просто посмотреть глазками, что там разное ;-))
    2) вы уверены, что написать подобную задачку на любом языке программирования будет не проще?
    3)
    Цитата:
    А вопрос такой - может ли Эксель, открывая слишком длинный столбец данных, размещать это дело самостоятельно в нескольких последовательных колонках

    насколько я знаю - нет, не может... Нужно писать свою обработку текстового файла, хоть на VBA, хоть на любом языке программирования.  
     
    Добавлено:
    оп-па. Пока я тут прыгал, проблема уже и решена.

    Цитата:
    проблему решил своеобразно - с помощью программульки WinMerge.

    ;-)) я же говорил - Excel в данном случае не очень подходит.
    закрываем дискуссию... ;-)

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 05:45 23-10-2006 | Исправлено: SERGE_BLIZNUK, 05:49 23-10-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