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

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



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

    Цитата:
    в этой ячейке иногда бывает запись "#ЗНАЧ!" и макрос вешается, error 13, Type missmatch... что сделать что бы он "0" присваивал и не вылетал на этой строчке программы???

    Возможный вариант:

    Код:
     
    m = 0
    On Error Resume Next
    m = CDbl(Worksheets("1").Cells(d, 1))
    On Error GoTo 0
     

    Всего записей: 396 | Зарегистр. 08-06-2005 | Отправлено: 08:58 06-07-2006 | Исправлено: Anjin_Kazawa, 09:01 06-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Csen
    Как m описана?  
    Можно попробовать Dim m As Variant
    Или проверять значение ячейки перед присваиванием:
    Код:
    If IsNumeric(ActiveSheet.Cells(1, 1)) Then
        m = ActiveSheet.Cells(1, 1)
    Else
        m = 0
    End If

    Или
    Код:
    If IsError(ActiveSheet.Cells(1, 1)) Then
        m = 0
    Else
        m = ActiveSheet.Cells(1, 1)
    End If


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

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я могу средствами vba посчитать экселевскую формулу, не прибегая к записи в ячейки?
    Т.е. есть строка, например, "=(1+2)*3", и нужно получить ответ 9, запихнув эту строку в какую-нибудь функцию. Свой парсер писать не хочется.

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Dr Eam
    Используй объект WorksheetFunction.

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

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Спасибо. Но что-тоя никак не могу найти, как с помощью неё вычислять именно произвольные формулы, записанные в текстовом виде. Там ведь можно только вызывать любые стандартные функции...
     
    Т.е. нужен, по сути, не WorksheetFunction, а WorksheetFormula.
     
     
    Добавлено:
    Yuk
    Всё, нашёл. WorksheetFunction не смог использовать, а получилось всё с Evaluate.

    Всего записей: 226 | Зарегистр. 20-12-2005 | Отправлено: 10:57 06-07-2006 | Исправлено: Dr Eam, 11:03 06-07-2006
    Virtualexx



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста, как сделать, чтобы макрос при нажатии на кнопку добавлял +1 к значению ячейки?  
    Допустим, начальное значение ячейки 0. Нажал: 1, нажал: 2, нажал: 3 и т.д.

    Всего записей: 10 | Зарегистр. 06-07-2006 | Отправлено: 12:34 06-07-2006
    Dr Eam

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Гм. Cells(<адрес>).Value = Cells(<адрес>).Value + 1 подойдет?

    Всего записей: 226 | Зарегистр. 20-12-2005 | Отправлено: 12:48 06-07-2006
    Virtualexx



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я наверное не так написал, но ничего не происходит:
     

    Код:
     
    Sub add()
    '
    ' add Макрос
    ' Макрос записан 06.07.2006 (Alex)
    '
     
    '
        Sheets("Лист2").Select
        Cells("D2").Value = Cells("D2").Value + 1
         
         
    End Sub
     

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Virtualexx
    надо было так написать
    Cells(2, 4).Value = Cells(2, 4).Value + 1  
    или
    Range("D2").Value = Range("D2").Value + 1  
     

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



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DONRU1, Dr Eam, огромное спасибо!!!

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    'CYR 2 LAT Translator.

    Всего записей: 2131 | Зарегистр. 17-03-2005 | Отправлено: 15:40 06-07-2006
    Virtualexx



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Еще такая вещь: можно ли защитить ячейку от случайного попадания курсора и изменения значения. Все, что я не пробовал, выливается в то, что ячейка блокируется не только для изменения таким образом, но и для записи результата макроса...

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Virtualexx
    Можно, но через задницу:
    При изменении любой ячейки проверяем ее адрес:
    Код:
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address = "$A$1" Then
            Application.Undo
        End If
    End Sub

    А в макросе запрещаем обработку событий:
    Код:
    Sub test()
        Application.EnableEvents = False
        Range("A1").Value = 0
        Application.EnableEvents = True
    End Sub

    Может и как-то по другому можно. надо подумать.

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

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

    Цитата:
    ячейка блокируется не только для изменения таким образом, но и для записи результата макроса...  

    ещё вариант (правда мне он не нравится, но, по эффективности он может быть не хуже, чем предложенный уважаемым Yuk:
     

    Код:
     
        ActiveSheet.Unprotect
        ActiveCell.FormulaR1C1 = "www"
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
     

     
    т.о. защиту листа можно отключить в макросе, изменить содержимое защищенной ячейки и поставить опять защиту на лист.
     

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



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

    Цитата:
    не хуже, чем предложенный уважаемым Yuk


     
    Мне вот интересно, многие спрашивают, а потом пропадают. Это понимать как все получилось или не фига не получилось и забили?

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

    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Здравствуйте, уважаемый, All!
     
    Подсткажите подалуйста, как можно проверить принадлежность ячейки к диапозону ячеек.
    Т.е. событие OnCange передает мне объект Target - ячейку в которой оно произошло
    Надо чтобы программа работала так:
    if Target принадлежит Range("A5:D5") then
               какой-то код
    else
               другой код
    end if
     
    большое спасибо))

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

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

    Цитата:
    Мне вот интересно, многие спрашивают, а потом пропадают. Это понимать как все получилось  

    Ну, прежде всего, не все, как мы круглосуточно сидим на форуме ;-))
    И тут надо подходить согласно старого принципа:
    Если ваши родственники вам не звонят и не пишут, значит у них всё хорошо. ;-))
     
    По поводу защиты ячейки. Задачка с виду очень простая, но сложно решаемая ;-))
    Честно говоря, я не знаю, зачем Virtualexx это нужно ? (ну какое практическое назначение)
     
    и ещё, если не секрет, у вас, господин Yuk, программирование на VBA - это хобби или профессиональное? Вы самоучка? И что за литературу/софт вы использовали для обучения?
     

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RobinStone
    В шапке пример 3.
     
    SERGE_BLIZNUK
    скорее хобби (профессионально VBA заниматься - на фиг-на фиг), самоучка, изучал методом тыка, примерно как описал в шапке.
    Цитата:
    не все, как мы круглосуточно сидим на форуме
    И то правда...
     

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



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет! Вы зря кипятитесь. Я бы обязательно написал. В общем отвечаю на вопросы. Нужно все это, т.к. коммерческий директор попросил придумать что-нибудь в excel что помогало бы определить эффективность рекламы компании. Т.о. я повспоминал чему учили когда-то и придумал программу для опроса клиентов, которая показывает статистику обращений по каждому виду рекламы. С вашей помощью я сварганил ее первый модуль, дальше планирую немного усложнить, но это как время будет. Если надо кому, с удовольствием отправлю по мылу. Пишите: djhmr@tut.by.

    Цитата:
    Честно говоря, я не знаю, зачем Virtualexx это нужно ?
     
    Если вы про защиту ячейки, то для того, чтобы накрашенные менеджеры(-рицы) по продажам, нечаянно поставив чашку кофе на клавиатуру или мышь, не испортили задуманное =))
     
    А по защите ячейки я использовал решение от SERGE_BLIZNUK, итого получилось:
     

    Код:
    Sheets("Лист2").Select
        ActiveSheet.Unprotect
        Range("D4").Value = Range("D4").Value + 1
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
         
     
    End Sub

     
    Все замечательно работает. Вариант от Yuk, к сожалению, не пробовал. Но всем огромное спасибо!!!
     
     
     
    Добавлено:
    Ага не все гладко... Почему-то после выполнения такого макроса защиту листа стало возможным снять без ввода пароля. Преределал. Снял блокировку с ачеек с результатами вычисления и поменял макрос таким образом (Yuk):
     

    Код:
    Application.EnableEvents = True
        Sheets("Лист2").Select
        Range("D26").Value = Range("D26").Value + 1
        Application.EnableEvents = False
        ActiveWorkbook.save
         
    End Sub

     
    Добавил сохранение книги, как видите. Пока доволен =)))
     
    Еще вот что, можноли создать кнопку (макрос), которая будет отменять действие последнего выполненного макроса? Типа, не на ту кнопку красавица нажала: ой, что делать?

    Всего записей: 10 | Зарегистр. 06-07-2006 | Отправлено: 10:09 07-07-2006 | Исправлено: Virtualexx, 10:15 07-07-2006
    eowyn

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Принесли файл с макросами, которые работали и перестали вдруг работать. Хочется глянуть, почему, а открыть или изменить макрос нельзя.  В редакторе VBA при попытке открыть проект выскакивает сообщение project is unviewable. В окне выбора макросов макрос видно, но его можно только выполнить. Кнопка изменить не активна. При отключении макросов картина аналогичная.

    Всего записей: 2 | Зарегистр. 12-08-2005 | Отправлено: 12:52 07-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