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

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



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

    Цитата:
    ActiveSheet.ChartObjects(1).Activate  
        ActiveChart.SeriesCollection(1).Trendlines(1).DataLabel.Select  
        Cells(1, 1) = Selection.Characters.Text  

     
    Тренд имеет след. вид функции: y = -0,1818x2 + 2,4109x + 8,4.  (x2 - это х в квадрате).
    Указанный способ считывает функцию в таком виде. Но, как известно, в ячейку можно "вбить" функцию, и она при изменении данных в соответствующих ячейках меняет автоматически свое значение. Указанный вариант просто полностью считывает, а как автоматизировать ее "вбиение" в ячейки, чтобы потом данные соответственно изменялись?

    Всего записей: 162 | Зарегистр. 19-01-2004 | Отправлено: 18:23 04-06-2005
    wtt



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ой,дамы и господа,а у меня такой вопрос
    Есть клетка на листе Excel ,в ней формула: =3,5*4+2,3*12+1*5(например)
    Вопрос: как можно каждое отдельно взятое число “вытянуть” с помощью VBA?
    P.S.: таких клеток-великое множество, и все они разные по длине и содержанию.

    Всего записей: 106 | Зарегистр. 05-02-2004 | Отправлено: 20:37 04-06-2005
    evle



    1 + int rand(100);
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wtt
    Скорее всего стандартными методами никак (если ты про числа внутри формулы). Они по отдельности нигде не хранятся. Можно получить всю формулу целиком и пропарсить как-нибудь (разбить на составные части).

    ----------
    For every complex problem, there is a solution that is simple, neat, and wrong.

    Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 20:43 04-06-2005
    wtt



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

    Цитата:
    Можно получить всю формулу целиком и пропарсить как-нибудь (разбить на составные части)
    -намекни,как примерно это можно сделать.
     

    Всего записей: 106 | Зарегистр. 05-02-2004 | Отправлено: 21:07 04-06-2005
    evle



    1 + int rand(100);
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wtt
    02:07 05-06-2005
    Цитата:
    намекни,как примерно это можно сделать.  

    Пробежать по строке, добавлять в строковую переменную текущий символ, если это цифра или запятая (точка). Если встретился символ, отличный от нужных, содержимое переменной добавлять в массив, переменную очищать, идти дальше.
    В общих чертах так.
    А вообще, для какой цели это надо? Может исходная проблема проще решается?

    ----------
    For every complex problem, there is a solution that is simple, neat, and wrong.

    Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 21:22 04-06-2005
    wtt



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    evle
    В принципе,что-то похожее и я думал.
    Это надо для удобства и быстроты.Речь идёт про анализ большого количества однотипных деталей которые отличаются друг от друга двумя параметрами: длиной и количеством.
    т.е.:=длина1*кол-во1+длина2*кол-во2+ и т.д.(таких клеток много)
    Классический метод заполнения отдельного столбца-длина и отдельного-количество неудобен по производительности и по некоторым другим причинам.

    Цитата:
    Пробежать по строке
    -так пробовать и буду,только возникают вопросы,как VBA сможет отличить числа от знаков "=","+","*"?

    Всего записей: 106 | Зарегистр. 05-02-2004 | Отправлено: 22:12 05-06-2005
    GrayElf

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wtt
    Что ты имеешь в виду? Ищи знаки той же функцией InStr и все.
    Linda
    Как уже сказал evle, нужно не сразу писать текст в ячейку, а сначала его пропарсить, например так:

    Код:
     
      ActiveSheet.ChartObjects(1).Activate
        ActiveChart.SeriesCollection(1).Trendlines(1).DataLabel.Select
        Dim a As String
        a = Selection.Characters.Text
        a = Right(a, Len(a) - InStr(1, a, "=") + 1)
        a = Left(a, InStr(1, a, "x2") - 1) + "*A1" + Right(a, Len(a) - InStr(1, a, "x2") - 2)
        a = Left(a, InStr(1, a, "x") - 1) + "*A2" + Right(a, Len(a) - InStr(1, a, "x") - 1)
        Cells(1, 3) = a
     

    All
    Только вот срабатывает этот код, только если в установках языковых параметров в качестве разделителя дробной части точка, кто-нибудь знает как поправить?

    Всего записей: 34 | Зарегистр. 19-04-2005 | Отправлено: 05:23 06-06-2005
    evle



    1 + int rand(100);
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GrayElf
    10:23 06-06-2005
    Цитата:
    Только вот срабатывает этот код, только если в установках языковых параметров в качестве разделителя дробной части точка, кто-нибудь знает как поправить?  


    Цитата:
    DecimalSeparator Property
    Sets or returns the character used for the decimal separator as a String. Read/write.
     
    expression.DecimalSeparator
    expression    Required. An expression that returns an Application object.
     
    Example
    This example places "1,234,567.89" in cell A1 then changes the system separators to dashes for the decimals and thousands separators.
     
    Sub ChangeSystemSeparators()
     
        Range("A1").Formula = "1,234,567.89"
        MsgBox "The system separators will now change."
     
        ' Define separators and apply.
        Application.DecimalSeparator = "-"
        Application.ThousandsSeparator = "-"
        Application.UseSystemSeparators = False
     
    End Sub


    ----------
    For every complex problem, there is a solution that is simple, neat, and wrong.

    Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 06:19 06-06-2005
    GrayElf

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    evle
    Я не о том, DecimalSeparator устанавливает системный разделитель, он стоит нормальный - запятая, а Excel ругается при вводе через макрос, например, "=1,5". Еще один похожий глюк есть, если вводить формулу с русскими символами ("=сумм(a1:a5)" например) через VBA, то результат не появляется в ячейке, пока не нажмешь ее редактировать и обновить

    Всего записей: 34 | Зарегистр. 19-04-2005 | Отправлено: 10:07 06-06-2005
    evle



    1 + int rand(100);
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GrayElf
    Я так понимаю, ты использовал свойство Formula. А с какой стати русский язык и DecimalSeparator должны там работать?
    Чтобы вводить на русском используется свойство FormulaLocal

    Цитата:
    Assume that you enter the formula =SUM(A1:A10) in cell A11 on worksheet one, using the American English version of Microsoft Excel. If you then open the workbook on a computer that's running the German version and run the following example, the example displays the formula =SUMME(A1:A10) in a message box.

    А лучше все-таки для уменьшения путаницы пользоваться английской версией формул (с английскими названиями функций и точкой в качестве разделителя).

    ----------
    For every complex problem, there is a solution that is simple, neat, and wrong.

    Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 11:01 06-06-2005
    GrayElf

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    evle
    Большое спасибо! Действительно с FormulaLocal работает.

    Всего записей: 34 | Зарегистр. 19-04-2005 | Отправлено: 12:40 06-06-2005
    gloos

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ, помогите, у меня есть отчет на одном листе. На другом листе имеется содержание, которое выполнено в виде гиперссылок на ячейки отчета. Как можно автоматически заполнить номера страниц в содержании. Пробовал работать с объектом HPageBreaks и VPageBreaks - ну очень долго.

    Всего записей: 1 | Зарегистр. 07-06-2005 | Отправлено: 11:59 07-06-2005
    755df



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    кто подскажет как сделать следующее:
    есть таблица
           A              B              C        D
    1    100           aaa         bbb     ddd
    2    101            ggg        hhh      ghk
    3    
     
    нужно чтобы выполнилось  условие : если в строке Х значение ячейки  А =0 то выделить строки на 2 ячейки выше( в данном случае строка 2 и 1)  
    и скопировать выделенные строки в другой лист

    Всего записей: 21 | Зарегистр. 06-11-2004 | Отправлено: 17:52 18-06-2005
    Sleepwalker



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    755df
    если тебе надо удалить таким образом пустые строки, то это можно гораздо проще сделать.
    если какие-то свои мотивы, то всегда код можно получить, выполнив запись макроса.
    Например
     
    Dim last2 As Integer
    last2 = 1
    Лист1.Select
    For i = 3 To 15
      If Cells(i, 1) = "" Then
        Range("A" & CStr(i - 2) & ":C" & CStr(i - 1)).Select
        Selection.Copy
        Sheets("Лист22").Select
        Range("A" & CStr(last2)).Select
        last2 = last2 + 2
        ActiveSheet.Paste
        Sheets("Лист1").Select
      End If
         
    Next i

    Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 21:44 21-06-2005
    Tema123



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

    Всего записей: 123 | Зарегистр. 28-01-2002 | Отправлено: 00:03 30-06-2005
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tema123
    при помощи цикла пробегаешь по всем номерам багов в екселе и для каждого делаешь при помощи Select выборку статуса из базы и занесение в таблицу статуса.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:43 30-06-2005
    Tema123



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

    Цитата:
    Tema123  
    при помощи цикла пробегаешь по всем номерам багов в екселе и для каждого делаешь при помощи Select выборку статуса из базы и занесение в таблицу статуса.

    проблема в том, что я не знаю как вставить селект в ВБ код, каким образом конект к базе сделать

    Всего записей: 123 | Зарегистр. 28-01-2002 | Отправлено: 10:15 30-06-2005
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tema123
    Вот примерно что надо писать в макросе для заполнения

    Цитата:
     
    AppInitialize
    Set Sht = Workbooks("Название.xls").Worksheets("Лист1")
    Set Srv = CreateObject("sqlole.SQLServer") ' Create a SQL Server Object
    If UserForms.Count = 0 Or _
    Not Sht.Parent.Names("Connected").Value = "=ИСТИНА" Then
        OK = False
        fConnect.Show
        If Not OK Then
            Exit Sub
        End If
            Sql = _
            "USE " + db + _
            " SET DATEFORMAT dmy" + _
            " SELECT Convert(varchar(10),DateDays,104), DateDays FROM vDateDays" + _
            " UNION SELECT Convert(varchar(10),DateWork,104), DateWork FROM vDateWork" + _
            " ORDER BY DateDays DESC"
            Set res = Srv.ExecuteWithResults(Sql)
            Load fBuhJrnl
            For i = 1 To res.Rows
                fBuhJrnl.cbDateDays.AddItem (res.GetColumnString(i, 1))
            Next i
            fBuhJrnl.cbDateDays.Value = res.GetColumnString(1, 1)
    Else
            Srv.Connect "Сервер", fConnect.tbName.Text, fConnect.tbPassword.Text
    End If
    OK = False
    fBuhJrnl.Show
    If Not OK Then
        Exit Sub
    End If
    Sql = "USE " + db + " SET DATEFORMAT dmy Exec pBuhJrnl @DateJrnl=""" + fBuhJrnl.cbDateDays.Value + """"
    Set res = Srv.ExecuteWithResults(Sql)
    i1 = 0: i2 = 0: i3 = 0: i4 = 0
    it1 = Sht.Parent.Names("_it1").RefersToRange.Row + 1
    it2 = Sht.Parent.Names("_it2").RefersToRange.Row + 1
    it3 = Sht.Parent.Names("_it3").RefersToRange.Row + 1
    it4 = Sht.Parent.Names("_it4").RefersToRange.Row + 1
    For i = 1 To res.Rows
    If Left(res.GetColumnString(i, 2), 8) = "20202810" Or Left(res.GetColumnString(i, 3), 8) = "20202810" Then
        If Sht.Cells(it2 + i2 + 1, 1).Text = "Итого по" Then
            Sht.Cells(it2 + i2, 1).EntireRow.Insert
            ins = True
        Else
            ins = False
        End If
        Sht.Cells(it2 + i2, 1).Formula = res.GetColumnString(i, 1)
        Sht.Cells(it2 + i2, 2).Formula = "'" + res.GetColumnString(i, 2)
        Sht.Cells(it2 + i2, 3).Formula = "'" + res.GetColumnString(i, 3)
        Sht.Cells(it2 + i2, 4).Formula = res.GetColumnString(i, 4)
     
     



    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:43 30-06-2005
    Cfg3001

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как можно макросом свернуть таблицу:
     
    Есть таблица с несколькими колонками - часть из них числа, часть текст.
    В таблице есть повторяющиеся строки (т.е. текстовые колонки одинаковые, числовые могут быть разные). Нужно сложить числовые колонки в одну строку. Остальные строки удалить.

    Всего записей: 1 | Зарегистр. 17-03-2005 | Отправлено: 21:07 30-06-2005
    Asylum

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Можно ли запускать EXCEL в фоновом режеме без запросов из HTM файла?
    Задача простая - надо в htm-файле (менно в htm!) каталог сделать, чтобы при нажатии на картинку нужный файл вместе с excel - ем подгружался. И не задавал дурацких вопросов типа "Открыть или сохранить этот файл?"
    Может кто-нибудь что-то другое предложит? Буду весьма признателен.

    Всего записей: 195 | Зарегистр. 23-01-2004 | Отправлено: 00:21 01-07-2005
       

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