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

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
    честно говоря, тоже не понял. Видимо, ComboBox лежит на листе, как ActiveX или что-то вроде. Он привязан через Source к ячейке (2,9). (сразу возникает вопрос, почему список не был сделан через проверку данных?) Когда он меняется, что-то на листе тоже творится. Вот что должно происходить на листе - не ясно. Зачем нужно что-то писать в другие ячейки тоже, честно говоря, не ясно, поскольку в экселе существует встроенный инструмент для отслеживания изменений.
    Вот так я это понял. Не факт, что понял правильно.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 15:01 03-04-2007
    hackman



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Здраствуйте. Макрос который убирает ошибку деления на ноль я доработал. Он ставит формулу ЕСЛИ только на ячейки с ошибками. Подскажите как сделать так, что б макрос работал только с ошыбками ДЕЛ/0, а остальные ошыбки не обрабативал. (например знач или ССЫЛКА).

    Код:
     
    Public Sub AddIf_to_eror_formula()
         
     
        Dim cFormulaCol As Integer
        Dim i As Long, vFormula As String
        Dim vFirst As Long, vLast As Long
         
        For cFormulaCol = 1 To 256
         
        vFirst = ActiveSheet.UsedRange.Row
        vLast = vFirst + ActiveSheet.UsedRange.Rows.Count - 1&
         'IsNumeric(Cells(i, cFormulaCol).Value
        For i = vFirst To vLast
            vFormula = Trim$(Cells(i, cFormulaCol).Formula)
           ' If IsNumeric(Cells(i, cFormulaCol)).Value Then GoTo 5 Else GoTo 10
    5
            If Application.WorksheetFunction.iserror(Cells(i, cFormulaCol).Value) Then Else GoTo 10
                If Mid$(vFormula, 1&, 1&) = "=" Then
                vFormula = Mid$(vFormula, 2&)
                vFormula = "=IF(ISERROR(" & vFormula & "),0," & vFormula & ")"
                Cells(i, cFormulaCol).Formula = vFormula
    10
            End If
        Next i
        Next cFormulaCol
    End Sub
     

     

    Всего записей: 185 | Зарегистр. 22-09-2003 | Отправлено: 13:08 04-04-2007 | Исправлено: hackman, 13:15 04-04-2007
    filemoto



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

    Цитата:
    Ну, не совсем так. Чтобы не разводить оффтоп, если интересно, да и вдруг кому пригодится, выложил

     
    Прикольная штука. Спасибо. Конечно пригодится
     

    Всего записей: 132 | Зарегистр. 08-04-2006 | Отправлено: 13:46 04-04-2007
    Farest

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    The okk,AndVGri
    Если интересно можно посмотреть
    http://upload2.net/page/download/Gcz4mGHv1vZ8wRw/%D0%E0%F1%F7%B8%F2++%F4%F3%F0%ED%E8%F2%F3%F0%FB+%ED%E0+AGS+%E4%E2%E5%F0%E8+1.xls.html

    Всего записей: 119 | Зарегистр. 07-05-2006 | Отправлено: 14:07 04-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    hackman
    Держи, слепил функцию для проверки ячейки на
    Цитата:
    олько с ошыбками ДЕЛ/0


    Код:
     
    Public Function isDivisionByZero(ByVal inCell As Range) As Boolean
        Const FuncName As String = "ERROR.TYPE("
        Dim refName As String, Result As Boolean
         
        Result = False
        If inCell.Errors(xlEvaluateToError).Value Then
            refName = inCell.Parent.Name & "!" & inCell.Address(ReferenceStyle:=xlR1C1)
            If Application.ExecuteExcel4Macro(FuncName & refName & ")") = 2& Then Result = True
        End If
        isDivisionByZero = Result
    End Function
     

    Возвращает True - если ячейка содержит ошибку деления на ноль

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 15:00 04-04-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    hackman
    немного нечестно, но всё таки...
    через                  
      If Application.Evaluate("Error.Type(" & Cells(i, cFormulaCol).Address & ")") = 2  
    полностью процедура

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 15:39 04-04-2007
    cluster

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

    Цитата:
    Народ, подскажите, пожалуйста, код для календаря (Элемент управления Office 2003), чтоб при нажатии на число, соответсвующая дата появлалась в определенной ячейке. Или ссылочку, где это описывается. Спасибо.


    Код:
    Private Sub Calendar1_Click()  
    Cells(5, 3).Value = Calendar1.Object  
    End Sub

    Ребят, подскажите по пунктам, что с этим делать?

    Всего записей: 1720 | Зарегистр. 21-11-2003 | Отправлено: 22:18 04-04-2007
    jONES1979



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    cluster
    вот посмотри попробуй http://slil.ru/24185693
    В примере объект "Microsoft MonthView Control 6.0". Не знаю, его ли ты имел в виду.
     
    p.s. только щас заметил. не в ту ячейку он в примерчике выводит дату. неуследил

    Всего записей: 324 | Зарегистр. 20-05-2005 | Отправлено: 23:12 04-04-2007
    cluster

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jONES1979
    аа, кул) пасиба, этот файлик помог. (способ №1) уже всё под себя подстроил.

    Всего записей: 1720 | Зарегистр. 21-11-2003 | Отправлено: 14:00 05-04-2007
    evsino

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    помогите плиз
    то ли глюк толи я неуч
    записываю макрос открыть файл при открытом файле
    а тамничего нет только window().activate
    копирую ячейку из одной книги в другую вылетает то код9 то 1044 или еще что
    у меня EXCEL 2003 sp2
     может что не подключено переустановка ничего не дала
    я ведь делаю самые простые действия ну железно должно работать а не работает

    Всего записей: 26 | Зарегистр. 13-11-2006 | Отправлено: 21:17 05-04-2007
    AndVGri

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

    Цитата:
    window().activate

    вот такого быть не может. Может быть где-то так (приведите код, если не нужен ответ про  где-то так)
    Windows("Книга.xls:1").Activate

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 03:37 06-04-2007
    aks_sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста, что не так делаю?
     
    Sub Макрос8()
    Application.ScreenUpdating = False
    Dim r As Long, LastRow As Long, s As Long, FinalRow As Long
        LastRow = Worksheets("Ведомость").Range("E65536").End(xlUp).Row
        FinalRow = Worksheets("Остаток").Range("A65536").End(xlUp).Row
        For r = 10 To LastRow
            If Worksheets("Ведомость").Cells(r, 5).Value > 0 _
            And Worksheets("Ведомость").Cells(r + 2, 5).Value _
            = Worksheets("Ведомость").Cells(r, 5).Value Then
                    For s = 1 To FinalRow
                    Worksheets("Остаток").Cells(s, 1).Value _
                    = Worksheets("Ведомость").Cells(r, 2).Value
                    Next s
            End If
        Next r
                 
    End Sub

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 08:03 06-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aks_sv
    А что тут делается? А в чём проблема?  
    Судя по коду - первый цикл по r должен быть до LastRow - 2, иначе Worksheets("Ведомость").Cells(r + 2, 5).Value будет уже вне диапазона данных от r = LastRow - 1.
    Зачем во втором вложенном цикле присваивается одно и тоже значение Worksheets("Ведомость").Cells(r, 2).Value всему диапазону 1..FinalRow? А условие входа в этот цикл выполнится несколько раз - должен остаться последний проход? Не проще ли тогда в первом цикле найти последнее значение Worksheets("Ведомость").Cells(r, 2).Value, а только потом сделать цикл присвоения на листе "Остаток"?
    Да и не забудьте вернуть  Application.ScreenUpdating = True

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 08:25 06-04-2007 | Исправлено: AndVGri, 08:40 06-04-2007
    aks_sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
    У меня имеется таблица на листе "Ведомости":
     
                B                C        D          E
     
          Болт М 16х55        403,39
                  5,000
            15.00006.03        403,39
                  5,000
            Болт М 6х25        216,10
                  2,000
            15.00004.03        216,10
                  2,000
            Болт М 6х40        324,15
                  3,000
            15.00005.03        324,15
     
    В столбце В наименованию деталей соответствуют значения в столбце Е - цена а ниже количество. В столбце В ниже наименования через строчку индекс этой детали а в столбце Е повторяется цен и количество. Так вот мне необходимо получить на листе "Остаток" таблицу в следующем виде:
     
           А                    В            С
     
    Болт М 16х55     403,39     5,000
    Болт М 6х25       216,10     2,000           и т.д.
                

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 08:57 06-04-2007
    The okk



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

    Код:
    Sub Macros8()
        Dim xlInitialCalcState As XlCalculation
        Dim Cell As Range, rngOstatok As Range
        With Application
            .ScreenUpdating = False
            xlInitialCalcState = .Calculation
            .Calculation = xlCalculationManual
     
            Set rngOstatok = Worksheets("Остаток").Range(Cells(1, 1), _
                             Cells(Rows.Count, 1).End(xlUp))
            For Each Cell In Worksheets("Ведомость").Range(Cells(10, 5), _
                              Cells(Rows.Count, 5).End(xlUp))
                With Cell
                    If (.Value > 0) And (.Offset(2) = .Value) Then _
                       rngOstatok.Value = .Value
                End With
     
            Next Cell1
            .Calculation = xlInitialCalcState
            .ScreenUpdating = True
        End With
    End Sub

     
    Вот примерно это ты пытаешься сделать. В результате ты имеешь на листе "Остаток" в первом столбце набор одинаковых значений.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 09:05 06-04-2007
    aks_sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
     
    Что-то плохо таблица получилась:
           В          С          D          E
    Болт М 16х55                     403,39
                                               5,000
    15.00006.03                       403,39  
                                               5,000
    Болт М 6х25                       216,10
                                               2,000  
    15.00004.03                       216,10  
                                               2,000
    Болт М 6х40                        324,15
                                               3,000
    15.00005.03                        324,15
                                               3,000
     
    И еще : в столбце Е может находится промежуточная сумма всех деталей, которой не должно быть на листе "остаток"  
     
     
     
     

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 09:07 06-04-2007
    The okk



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

    Цитата:
    В столбце В наименованию деталей соответствуют значения в столбце Е - цена а ниже количество. В столбце В ниже наименования через строчку индекс этой детали а в столбце Е повторяется цен и количество. Так вот мне необходимо получить на листе "Остаток" таблицу в следующем виде:  

    хм... давай с начала. Я так понял, нас интересуют только столбцы В и Е.
    В столбце B чередуются названия и какие-то цифры. Строка - текст, строка - число?
    В столбце E остаток. Если он больше нуля, то берем значение из B и переносим его в лист "Остаток" в столбец А, цифру, стоящую в столбце В в строчке под названием, пишем в лист "Остаток" в  столбец С.
    Так?
    Как заполняется столбец В листа "Остаток"?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 09:16 06-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aks_sv
    А Вы не могли бы выложить файл с примером на одном листе исходные данные (обязательно включая промежуточные итоги) и результирующий, а то так выяснять где, что находится можно долго?

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 10:33 06-04-2007
    Ergistael

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

    Всего записей: 18 | Зарегистр. 06-04-2007 | Отправлено: 13:02 06-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ergistael
    В самом Excel, скорее всего, никак. Дело в том, что кнопка панели инструментов не получает никаких событий от Excel.  Можно создать класс, который будет отслеживать события Application (создав в нём переменную WithEvents FApp As Excel.Application) или других объектов и по созданным обработчикам пытаться выставить доступность требуемой кнопки панели. Но как инициализировать переменную этого класса? Можно написать собственную настройку в Excel, которая при загрузке инициализирует объект этого класса, но при нажатии кнопки Stop (например в VBE). Она сброситься и, соответственно, не будет работать обработчик событий приложения.
    К тому же, не у Application, не у Workbook я не нашёл события, которое обрабатывало изменение выделения с ячеек на графический объект.
    Возможно, нужно попробовать написать расширение в VB или где-то ещё, куда будет передаваться не уничтожаемая ссылка на Application, возможно там будет и более расширенная группа событий приложения. Пока не на чем попробовать, чтоб дать положительный ответ

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 13:52 06-04-2007
       

    Страницы: 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