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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ScorpionS

    Цитата:
    вместо "$A$1" сделать ссылку на ячейку на другом листе, допустим Лист2, ячейка D12?


    Код:
    Case Sheets("Лист2").Range("$D$12").Value


    Цитата:
    у меня попадает в какой-то цикл

    Естественно. А про Application.EnableEvents забыл? Что в результате происходит? Твоя функция запускается при смене ячейки. Но как только в самой функции происходит смена ячейки, она останавливается и запускается по новой. Обрати внимание, как это реализовано в моем коде.
    На время отладки рекомендую иметь макрос, разрешающий события, на случай, если твоя функция не отработает до конца.

    Код:
    Sub EE()
        Application.EnableEvents = True
    End

    И еще. Наверное, вместо функции SelectionChange надо бы использовать Workbook_SheetChange в ThisWorkbook(Code).
    А вместо Sheets("Формулы").Cells(89, 3) поставить Target, заключив код в  

    Код:
    If Sh.Name="Формулы" And Target.Address = "$C$89" Then

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

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:25 25-04-2006 | Исправлено: Yuk, 19:47 25-04-2006
    ScorpionS



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

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

    У меня тут один нюанс, значение в ячейке С89 (на листе "Формулы") я не меняю, эта ячейка привязана под Флажок (Элемент управления Формы).
    У меня когда я устанавливаю (снимаю) флажок, автоматически не скрываются (не отображаются) строки. Нужно зайти в любую ячейку (F2), нажать Enter только после этого выполняется функция скрытия (отображения) строк. Как можно решить эту проблему, чтобы это происходило сразу после установки (снятия) флажка. Причем срабатывает только с таким кодом

    Код:
     
    Private Sub Worksheet_Change(ByVal Target As Range)
      Application.EnableEvents = False
        'If Target.Address = Sheets("Формулы").Cells(89, 3) Then
        'Select Case Target.Address
        'Case Sheets("Формулы").Cells(89, 3).Value

            If Sheets("Формулы").Cells(89, 3).Value = 0 Then
              Rows("4:7").Select
              Selection.EntireRow.Hidden = True
              Range("F3").Select
            End If
            If Sheets("Формулы").Cells(89, 3).Value = 2 Then
              Rows("4:4").Select
              Selection.EntireRow.Hidden = False
              Rows("5:7").Select
              Selection.EntireRow.Hidden = True
              Range("F3").Select
            End If
            If Sheets("Формулы").Cells(89, 3).Value = 3 Then
              Rows("4:5").Select
              Selection.EntireRow.Hidden = False
              Rows("6:7").Select
              Selection.EntireRow.Hidden = True
              Range("F3").Select
            End If
            If Sheets("Формулы").Cells(89, 3).Value = 4 Then
              Rows("4:6").Select
              Selection.EntireRow.Hidden = False
              Rows("7:7").Select
              Selection.EntireRow.Hidden = True
              Range("F3").Select
            End If
            If Sheets("Формулы").Cells(89, 3).Value = 5 Then
              Rows("4:7").Select
              Selection.EntireRow.Hidden = False
              Range("F3").Select
            End If
       'End Select
        'End If

      Application.EnableEvents = True
    End Sub
     

    Если я использую Case или Target  (выделено курсивом), то не срабатывает.  
     
    P.S. Кстати, когда я сменил SelectionChange на Change, то у меня и без Application.EnableEvents в цикл не попадает.

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 20:42 25-04-2006 | Исправлено: ScorpionS, 20:59 25-04-2006
    Yuk



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

    Цитата:
    чтобы это происходило сразу после установки (снятия) флажка

    Дык надо сразу продумывать на какие события должна реагировать функция.
    В твоем случае. зайди в код своей формы и выбери функцию CheckBox1_Change() (или как там называется твой флажок). Вот туда и вставляй код.
    Обрати внимание на выпадающие списки вверху панели с кодом (объект и событие). Там можно выбрать на какое событие будет реагировать твоя функция.

    Цитата:
    Если я использую Case или Target  (выделено курсивом), то не срабатывает.

    Сработает, если изменишь значение в С89 в листе "Формулы".
    Цитата:
    P.S. Кстати, когда я сменил SelectionChange на Change, то у меня и без Application.EnableEvents в цикл не попадает.

    Естественно, так как у тебя нет в функции Change изменения значения ячейки, вот и не зацикливается. Пойми, что функции Change и SelectionChange отрабатывают разные события. Соответственно изменение значения ячейки и изменение позиции курсора.
     
    Добавлено:
    ScorpionS
    Очень советую понять, что делает каждая строчка кода. Используй брейкпоинты (F9) и watch (Shift-F9), чтобы отслеживать значения переменных. Поможет понять, почему не срабатывает функция.
    Удачи.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 23:49 25-04-2006
    pavelac



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите понять, что к чему  
    Модуль написаный на VBA в книге MS EXEL 2000 отказвается работать под  
    MS EXEL 2003  
    выдает ошибку:  
    Run-time error '91':  
    Object varible or With block varible not set  
    под 2000-м офисом все нормально ...  
    кусок кода, ошибочная строка красным:  
    Sub zapol()  
     
        Const ForReading = 1, ForWriting = 2, ForAppending = 3  
        Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0  
        Dim fs, f, ts, s  
    fileToOpen = Application _  
        .GetOpenFilename("INI Files (*.INI), *.ini")  
    If fileToOpen <> False Then  
        MsgBox "Open " & fileToOpen  
    End If  
        Set fs = CreateObject("Scripting.FileSystemObject")  
        Set f = fs.GetFile(fileToOpen)
        Set ts = f.OpenAsTextStream(ForReading, TristateUseDefault)  
        Set ts = fs.OpenTextFile(fileToOpen, ForReading, TristateUseDefault)  
         
        Do While ts.AtEndOfStream <> True  
        s = ts.ReadLine  
        ...

    Всего записей: 14 | Зарегистр. 21-12-2005 | Отправлено: 13:08 28-04-2006
    Yuk



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

    Все работает.
    MS Excel 2003 (11.6355.6360) SP1
     
    А что за файл пытаешься открыть и где?
    Какое значение у fileToOpen?

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



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Теперь все нормально, разбрался ...
    5-й касперский втихомолку запретил использование команды  
    CreateObject("Scripting.FileSystemObject")
    в результате получилось, что fs=Nothing и т.д.

    Всего записей: 14 | Зарегистр. 21-12-2005 | Отправлено: 10:05 02-05-2006
    ScorpionS



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Подскажи, пожалуйста, как правильно записать код. Что вместо ?НЕ УСТАНОВЛЕН?

    Код:
     
     
    Private Sub CheckBox1_Change()
      If CheckBox1 = ?НЕ УСТАНОВЛЕН? Then
          Rows("5:8").Select
          Selection.EntireRow.Hidden = True
          Range("F3").Select
       Else
          Rows("5:8").Select
          Selection.EntireRow.Hidden = False
          Range("F3").Select
    End Sub
     

    P.S. Нужно если не установлен чекбокс скрыть строки, а при его установке сразу отобразить.

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 19:03 02-05-2006
    DONRU1



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

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 19:11 02-05-2006
    ScorpionS



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DONRU1
    СПАСИБО! У меня так не получалось, оказывается я забыл End If, а я думал, что Flse неправильно.
    А если я добавляю ComboBox1 (поле со списком) где указать данные этого списка, нужно чтобы в списке отображалось 1, 2 и 3

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 19:25 02-05-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    где угодно  
    ComboBox1.AddItem 1
    ComboBox1.AddItem 2
    ComboBox1.AddItem 3

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 19:30 02-05-2006
    ScorpionS



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я вставляю такой код. Не получается. Что не так?

    Код:
     
    Private Sub ComboBox1_Change()
      ComboBox1.AddItem 1
      ComboBox1.AddItem 2
      ComboBox1.AddItem 3
    End Sub
     

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 19:35 02-05-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    нет не так.
    Если  ComboBox1 находится на UserForm то
     
    Private Sub UserForm_Initialize()
      ComboBox1.AddItem 1  
      ComboBox1.AddItem 2  
      ComboBox1.AddItem 3  
    End Sub
     
    Т.е. запонять ComboBox1 надо до его выполнения

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 19:43 02-05-2006
    ScorpionS



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    И так не получается. Объясни подробней, plz. У меня ComboBox1 (поле со списком) находится на листе Лист1 (там же, где и CheckBox1). Что такое UserForm?

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 19:47 02-05-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Хм. Ну если на листе, то можно заполнять ComboBox1 либо при открытии книги либо при нажатии на CheckBox1.
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    В данном случае условием заполнения является выбор(активация) листа - "Лист1"
     
    Private Sub Workbook_Open() при открытии книги  
    Worksheets("Лист1").ComboBox1.AddItem 1
    Worksheets("Лист1").ComboBox1.AddItem 2
    Worksheets("Лист1").ComboBox1.AddItem 3
    end sub  

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 20:01 02-05-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ScorpionS
    Используй либо событие активации листа Worksheet_Activate(), либо как DONRU1 указал, событие открытия книги Workbook_Open(). Selection_Change очень не рекомендую, будет реагировать на каждую смену положения курсора, что может жутко замедлить работу.

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Workbook_Open почему-то не срабатывает при открытии книги, а Worksheet_Activate() срабатывает только если перейти на другой лист, а потом на Лист1, а если изначально книга открывается на этом листе (а так оно и есть), то не срабатывает.
    Я сделал вот так

    Код:
     
    Private Sub CheckBox1_Click()
      If CheckBox1 = True Then
       Worksheets("Досье").ComboBox1.AddItem 1
       Worksheets("Досье").ComboBox1.AddItem 2
       Worksheets("Досье").ComboBox1.AddItem 3
      Else
       что сюда надо вставить
      End If
    End Sub
     

    При устанвоке галочки в CheckBox1 список поля состоит из 1, 2 и 3. Какой код нужно после Else, если хочется, чтобы при сняти галочки поле со списком очищалось? Иначе когда снимаешь галочку и ставишь заново, то в поле со списком повляется 1, 2 и 3 по два раза каждый (если еще раз снять и поставить, то по три раза каждый и т.д.)

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 13:15 03-05-2006 | Исправлено: ScorpionS, 13:29 03-05-2006
    Yuk



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

    Цитата:
    Workbook_Open почему-то не срабатывает при открытии книги

    Ты уверен? Поставь туда что-то типа MsgBox "Книга открыта".

    Цитата:
    что сюда надо вставить

    Что-то типа:

    Код:
    While ComboBox1.ListCount
        ComboBox1.RemoveItem 0
    Wend
    ComboBox1.Value = ""


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



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста, как применять Worksheet_Calculate или Workbook_SheetCalculate.  
    Мне необходимо, что бы макрос выполнялся при каждом перерасчёте формул на листе.

    Всего записей: 341 | Зарегистр. 15-02-2005 | Отправлено: 11:37 04-05-2006
    Yuk



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

    Цитата:
     Нажимаешь Alt-F11 (VBA редактор). Находишь слева свой файл, под ним ThisWorkbook (надеюсь, в русском как и в английском Excele). Двойным кликом по нему открываешь справа код ThisWoorbook (Код).  


    Цитата:
    Обрати внимание на выпадающие списки вверху панели с кодом (объект и событие). Там можно выбрать на какое событие (SheetCalculate) будет реагировать твоя функция.  
    Вот туда и вставляй код.  

    Это для Workbook_SheetCalculate.
    Для Worksheet_Calculate кликай соответственно на соответствующий лист.
    Выбирай одну из этих функций в зависимости от того, хочешь ли ты, чтобы макро срабатывал в любом месте книги или только на определенном листе.
     

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 18:35 04-05-2006
    ScorpionS



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Что не так записываю, пытаясь указать ячейку на (другом) листе Формулы

    Код:
     
    Private Sub Worksheet_Change(ByVal Target As Range)
      If "Формулы!$A$103" = 0 Then
       Range("107:107").Select
       Selection.EntireRow.Hidden = False
       Range("108:331").Select
       Selection.EntireRow.Hidden = True
       Range("A3").Select
      End If
    End Sub
     

    Выдает ошибку во второй строке. Разве "Формулы!$A$103" не правильно?

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 20:27 04-05-2006 | Исправлено: ScorpionS, 20:31 04-05-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.Board
    © Ru.Board 2000-2018

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru