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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите решить задачку:
    Есть 2 таблицы (А и Б), в А вводятся исходные данные (в одну строку), в Б отображаются конечные результаты вычислений(тоже в одной строке). Как сделать что бы при вводе новых данных в таблицу А, результат дописывался в таблицу Б в следующую строчку (то есть на строку ниже предыдущего результата) ?

    Всего записей: 178 | Зарегистр. 22-02-2007 | Отправлено: 00:40 11-03-2007
    AndVGri

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

    Цитата:
    (то есть на строку ниже предыдущего результата) ?

    Не совсем понял эту часть.
    Вариант для ввода данных в "А" и вывода результата в такую же строку для "Б", если что не так, то можно изменить по аналогии.
     
    Для листа "А" (в редакторе VBA своенный щелчёк в менеджере объектов на листе, в который вводятся данные) прописываем следующее:
     
    Private resSheet As Excel.Worksheet 'Лист результата
    Private meName As String 'имя этого листа с !R
     
    'МЕТОД: обработка события изменение
    'данных в ячейках листа
    Private Sub Worksheet_Change(ByVal Target As Range)
        'константная часть ссылки на ячейку листа данных
        Dim part As String
        'Пусть последнее данное в исходной таблице
        'вводится в колонке C (номер 3)
        If Target.Column = 3 Then
            'проерка инициализации листа результата
            If resSheet Is Nothing Then
                'Пусть лист результата называется Б
                Set resSheet = ThisWorkbook.Worksheets("Б")
                meName = Me.Name & "!R"
            End If
             
        'Пример для суммы трёх чисел текущей строки ввода
        'от колонки A до C
        part = meName & CStr(Target.Row)
        resSheet.Cells(Target.Row, 1&).FormulaR1C1 = "=SUM(" & part _
            & "C1:" & part & "C3)"
        End If
    End Sub
     
    Если вывод жёстко в следующую за последней строку листа, то, как вариант:
    resSheet.Cells(1&, 1&).End(xlDown).Offset(1&, 0&).FormulaR1C1 = _
        "=SUM(" & part & "C1:" & part & "C3)"
     
     
    Добавлено:
    Lexy4ka

    Цитата:
    не могу понять как сделать чтобы вводя в форме начальное и конечное значения а так же шаг, заполнялся один столбец в пределах этих значений с соответствующим шагом в документе с excel.  

     
    Где-то так
     
    Private Sub CommandButton1_Click()
        'Пусть начальное значение в TextBoxBegin
        'конечное значение в TextBoxLast
        'шаг приращения в TextBoxStep
        Dim vBegin As Double, vLast As Double, vStep As Double
        Dim i As Long, vCount As Long
        'получим численные данные
        vBegin = CDbl(TextBoxBegin.Text)
        vLast = CDbl(TextBoxLast.Text)
        vStep = CDbl(TextBoxStep.Text)
        'проверить на соответствие
        '...
        '...
        'вычислим число приращений
        vCount = VBA.Fix((vLast - vBegin) / vStep)
        i = 0&
        'пусть вывод значений начинается со строки 2 в столбце 1
        Do
            Cells(i + 2&, 1&).Value = vBegin + CDbl(i) * vStep
            i = i + 1&
        Loop Until i > vCount
        'проверка на кратность
        If Cells(i + 1&, 1&).Value < vLast Then Cells(i + 2&, 1&).Value = vLast
    End Sub

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 05:03 11-03-2007 | Исправлено: AndVGri, 06:10 11-03-2007
    Lexy4ka

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

    Всего записей: 3 | Зарегистр. 11-03-2007 | Отправлено: 12:25 11-03-2007
    maratino



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите пожалуйста!
    ........A....................B..........................C...................D..........................F....................G
    17017-4               5шт                       900              17017-3                    4шт                 850
    30017-4               5шт                       900              30017-3                    5шт                 850
    17017-4               2шт                       900              17017-5                    1шт                 850
    17017-4               5шт                       900              17017-3                    4шт                 850
                                                                              17017-3                    4шт                 850
                                                                              17017-3                    4шт                 850
    A.B.C. Это первоначальный прайс поставщика.  
    D.F.G  Это окончательный. Но там есть нестыковки в значениях(разница)
    Нужен макрос, который проведет синхронизацию между A.B.C. и D.F.G
    и как то обозначит разницу, и еще в D.F.G больше наименований чем должно было, и
    эту разницу, больше или меньше как то высветит
    Заранее благодарю

    Всего записей: 58 | Зарегистр. 11-03-2007 | Отправлено: 13:28 11-03-2007
    olik22

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

    Всего записей: 3 | Зарегистр. 24-02-2007 | Отправлено: 14:25 11-03-2007
    ZORRO2005



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

    Всего записей: 342 | Зарегистр. 08-10-2005 | Отправлено: 00:53 12-03-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Lexy4ka
     
    Private Const halfPi As Double = 1.5707963267949
    'Метод, вычисляющий среднегармоническое и число
    'значений функции больших среднегармонического
    'предполагается, что аргументы функции расположены
    'в столбце 1, начиная со строки 2
    Public Sub HarMeanReport()
        Dim vLast As Long, vCount As Long, i As Long
        Dim Result() As Double, vCurrent As Double
        Dim GreateCount As Long
        'определяем последнюю строку с данными
        vLast = Cells(2&, 1&).End(xlDown).Row
        ReDim Result(0& To vLast - 2&)
        vCount = 0&
        'цикл вычисления функции
        For i = 2& To vLast
            'проверим на  (n + 1 / 2) * Pi
            vCurrent = Cells(i, 1&).Value / halfPi
            If ((vCurrent - VBA.Fix(vCurrent)) = 0&) And ((VBA.Fix(vCurrent) Mod 2&) = 0&) Then
                Cells(i, 2&).Value = "НЕТ"
            Else
                Cells(i, 2&).Value = Math.Sin(Math.Sin(Cells(i, 1&).Value) * Math.Tan(Cells(i, 1&).Value))
                'заносим значения функции > 0 в массив
                If Cells(i, 2&).Value > 0# Then
                    Result(vCount) = Cells(i, 2&).Value
                    vCount = vCount + 1&
                End If
            End If
        Next i
        'отсечка по числу значений > 0
        ReDim Preserve Result(0& To vCount - 1&)
        'получить и сохранить среднегармоническое
        vCurrent = Application.WorksheetFunction.HarMean(Result)
        Cells(vLast + 2&, 2&).Value = vCurrent
        'определить и сохранить число значенией больших среднегармонического
        GreateCount = 0&
        For i = 0& To vCount - 1&
            If Result(i) > vCurrent Then GreateCount = GreateCount + 1&
        Next i
        Cells(vLast + 3&, 2&).Value = GreateCount
    End Sub

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 04:34 12-03-2007 | Исправлено: AndVGri, 04:38 12-03-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
    А зачем & ставить после цифр? Я, конечно, понимаю, что это делает из Integer Long, но влияет ли это на быстродействие?
     
    Добавлено:
    maratino
    А зачем тут макрос? Задача целиком решается с помощью функции ВПР и условного форматирования. Лучше этот вопрос задать в теме по Excel (ссылка в шапке)

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

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

    Цитата:
    А зачем & ставить после цифр? Я, конечно, понимаю, что это делает из Integer Long, но влияет ли это на быстродействие?  

    Да так, просто старая дурацкая привычка. Переполз на VB c Pascal, а там как-то нарвался на неверный результат из-за того, компилятор посчитал константу как integer а не Longint. Вот с тех пор и типизирую

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 10:25 12-03-2007
    The okk



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

    Цитата:
    Переполз на VB c Pascal, а там как-то нарвался на неверный результат из-за того, компилятор посчитал константу как integer а не Longint.

    Ясно. Сам раньше с паскалем работал. В VB раньше то же самое было. В некоторых случаях, когда работаешь со строками, % может и сейчас пригодиться.
    Кстати, в VBA обращение к ячейке со смещением выглядит так:

    Код:
    Cells(vLast, 2&).Offset(3&).Value = GreateCount

    Можно конечно и Cells(vLast + 3&, 2&).Value, просто так быстрее - за счет того, что вместо операции сложения идет просто обращение к свойству.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 10:47 12-03-2007
    LevT



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

    Объясните, почему  
     

    Код:
    Range("C29").CurrentArray.FormulaArray = "=TRANSPOSE('[Книга.xls]" + CStr(1) + "'!"  
    + Target + ")"

     
    работает, а  
     
     

    Код:
    Range("C29").CurrentArray.FormulaArray = GetFormulaArray (1)
     
    Function GetFormulaArray(Visit As Integer) As String
        GetFormulaArray = "=TRANSPOSE('[Книга.xls]" + CStr(Visit) + "'!" + Target + ")"
    End Function

     
    нет?
     
     
    Кстати, нашел несоответствие между русским 2007 и 2003: в первом работает =TRANSPOSE. а 2003 на нем спотыкается и требует =ТРАНСП    Кажется, верно и обратное. И не только этой функции касается.
     

    Всего записей: 17168 | Зарегистр. 14-10-2001 | Отправлено: 11:11 12-03-2007
    The okk



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

    Цитата:
    нет?  

    и в чем это проявляется? Каков результат, что за ошибка?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 12:30 12-03-2007
    LevT



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    рантайм еррор 1004    Нельзя установить свойство 'FormulaArray' класса 'Range'
     
     
    И вот еще прикол с COMExceptions и локализацией, на материале ворда, который вызывается из .NET:  
     

    Код:
      wordApp.Selection.InsertCaption(Label:="Рисунок", TitleAutoText:="", Title:="", _
                                Position:=Word.WdCaptionPosition.wdCaptionPositionBelow, ExcludeLabel:=False)

     
    - вызывает исключение в английском ворде (ему требуется чтобы Label:="Figure"). И наоборот.
     
     
    Добавлено:
     
    Ваааще, в 97 офисе VBA работал с гораздо меньшим количеством невнятных ошибок COM - они были вовсе незаметны. А сейчас то и дело спотыкается в рантайме, вместо того, чтобы отловить ошибку компилятором... Кажется, мелкомягкие сильно намудрили, обеспечивая .NET совместимость.
     

    Всего записей: 17168 | Зарегистр. 14-10-2001 | Отправлено: 12:52 12-03-2007 | Исправлено: LevT, 13:14 12-03-2007
    The okk



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

    Цитата:
    рантайм еррор 1004    Нельзя установить свойство 'FormulaArray' класса 'Range'  

    Попробовал - у меня все работает (только формулу упростил до "=" +CStr(Visit)). Посмотри в Watch, что у тебя за Range получается.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:16 12-03-2007
    LevT



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

    У тебя эксель какой - русский или англ? 2003? У меня этот эффект в русском 2007.
     
    Только вчера я напоролся на указанную несовместимость русского 2003 (=ТРАНСП) и русского же 2007 (=TRANSPOSE) и решил пересесть на последний.
     
     
    Добавлено:
     
    В 2003 та же петрушка. На что watch ставить?

    Всего записей: 17168 | Зарегистр. 14-10-2001 | Отправлено: 13:22 12-03-2007
    The okk



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

    Цитата:
    На что watch ставить?  

    В watch смотри на Range("C29").CurrentArray и Range("C29").CurrentArray.FormulaArray заодно.
     
    З.Ы.: у меня 2002

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:45 12-03-2007
    LevT



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

    Мой косяк. Забыл передать в функцию параметр Target - а Option Explicit не включен. Потому он Empty/Variant, и в результате ссылка невалидна.
     
    Извиняюсь за беспокойство. Это я сейчас только попробовал облениться , а раньше всегда декларировал все переменные.

    Всего записей: 17168 | Зарегистр. 14-10-2001 | Отправлено: 13:54 12-03-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LevT
    А, вон оно что! Я-то думал, глобальная.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:57 12-03-2007
    LevT



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

    А вот насчет =TRANSPOSE или =ТРАНСП.  Возвращаются нули там, где в исходном ранжде пустые ячейки. Как бы это победить? Мне надо чтобы пустота давала пустоту, а не ноль.
     

    Всего записей: 17168 | Зарегистр. 14-10-2001 | Отправлено: 15:25 12-03-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LevT
    "Ну у меня два варианта.." (с)
    Либо ты делаешь формулу массива с использованием конструкции =ЕСЛИ(,,""), то бишь возвращающую пустую строку, если ничего нет. - Классика.
    Либо в макросе (а как я понял, формула вводится только макросом) перед вставкой формулы определяешь размерность исходного массива и, уже зная его размер, прописываешь формулу в диапазон, соответствующий размеру исходного.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 15:34 12-03-2007 | Исправлено: The okk, 15:37 12-03-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