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

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Спасибо за подсказку. После того как заменил 0x на &H все получилось, и в том и другои варианте.

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 13:31 11-09-2006
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    отвечаю господину dimasfera
     
    вопрос:

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

     
    на ваш вопрос по VBA отвечу там, где положено ;-)))))
     
    в Excel нажмите Alt-F11 (Visual Basic) - в редакторе слева двойной щелчек по вашему листу
    появится форма ввода скрипта:

    Код:
     
    Sub All_Selected_Strings_to_Lower()
    For Each c In Selection
      Cur_Cell_Type = TypeName(c.Value)
      If Cur_Cell_Type = "String" Then
        c.Value = LCase(c.Value)
      End If
    Next
    End Sub
     

    не забудьте перед употреблением (запуском скрипта) выделить нужные ячейки и/или столбцы.

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста, как сделать так, чтобы в существующей диаграмме в качестве параметров .MinimumScale и  .MaximumScale можно было использовать значения ячеек (скажем A1 и A2)?
     
    Задача заключается в том, чтобы после исполнения макроса шкала на графике менялась в соответствии с полученными результатами. Спасибо

    Всего записей: 177 | Зарегистр. 10-03-2003 | Отправлено: 17:56 12-09-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    skotov
    В макрос:
    ActiveChart.Axes(2).MinimumScale = Range("A1").Value
    Можно, например, также определить минимум:
    ActiveChart.Axes(2).MinimumScale = WorksheetFunction.Min(Range("a1:a5"))
    Для .MaximumScale аналогично.
     
    Не надо постить в несколько топиков. Если вопрос по VBA, то в этот топик, если нет или пока не ясно, в FAQ. Я лично просматриваю оба.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:56 12-09-2006
    skotov

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Делаю так и получаю ошибку "Run-time error 1004 невозможно получить свойство ChartObjects класса Worksheet"
    Пишу так

    Код:
    ActiveSheet.ChartObjects("Диагр. 8").Activate
        ActiveChart.Axes(xlValue).Select
        With ActiveChart.Axes(xlValue)
            .MinimumScale = Range("J28").Value
            .MaximumScale = Range("K29").Value
            .MinorUnitIsAuto = True
            .MajorUnitIsAuto = True
            .Crosses = xlAutomatic
            .ReversePlotOrder = False
            .ScaleType = xlLinear
            .DisplayUnit = xlNone
        End With

     
    Что не так?
     
    P.S. сорри за двойной пост. Просто подумал, что топик по VBA ближе и написал в нем.

    Всего записей: 177 | Зарегистр. 10-03-2003 | Отправлено: 20:48 12-09-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    skotov
    Может имя ChartObject не правильное.
    Сравни:
    Debug.Print ActiveChart.Name
    Debug.Print ActiveChart.Parent.Name
    Во втором случае как раз выведется имя ChartObject

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 22:37 12-09-2006
    skotov

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Имя правильное - специально сначала записал макрос.
    Видимо туда можно вводить только число.. (( Может как-то еще можно попробовать?

    Всего записей: 177 | Зарегистр. 10-03-2003 | Отправлено: 10:22 13-09-2006
    SERGE_BLIZNUK

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

    Цитата:
    Видимо туда можно вводить только число..  

    сорри, что вмешиваюсь в ваше обсуждение.
    проверь, когда там в присвоении указана не ячейка, а конкретное число - ошибки нет???
    тогда твое предположение верно, и значение ячейки нельзя присваивать.  
    Но это вряд ли. скорее всего ошибка в другом - либо не тот объект(имя не то), либо свойство не то, либо оно вообще readonly...

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 11:21 13-09-2006 | Исправлено: SERGE_BLIZNUK, 11:24 13-09-2006
    MoKC0DeR



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Не удаляется toolbar

    Код:
    Private Sub Workbook_AddinUninstall()
        Application.CommandBars("my_tb").Delete
    End Sub

    Причем не удаляется только при деинсталяции AddIn. Ести запусть просто код - то работает.  
    В чем причина ?

    Всего записей: 510 | Зарегистр. 31-03-2004 | Отправлено: 12:10 13-09-2006 | Исправлено: MoKC0DeR, 12:13 13-09-2006
    skotov

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    Yuk
    Попробовал просто записать и запустить макрос - та же ошибка. Застривает на строке  
     ActiveSheet.ChartObjects("Диагр. 8").Activate  
     
    Проблема оказалась в названии диаграммы - заменил Диагр. на Chart и все получилось.
     
    Всем спасибо за помощь!

    Всего записей: 177 | Зарегистр. 10-03-2003 | Отправлено: 12:44 13-09-2006
    Funt123



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ситуация следующая:
    Есть ряд переменных: StepPrice_n1, StepPrice_n2, ... StepPrice_nn со своими числовыми значениями.
    И через цикл я приравниваю значения этих переменных другим переменным:
     
    for i=1 to n
    curStepPrice_i = "StepPrice_n" & i
    next n
     
    И вот не могу понять как это сделать, поскольку curStepPrice_i получают в качестве значения "StepPrice_ni", а не значения данных переменных.
    Помогите пожалуйста.
     
    Добавлено:
    Смотрите еще какой глюк обнаружил:
    Забил в первую ячейку число(без кавычек) "10,8", ниже "10,6", потянул _вниз_ и вот что получилось:
    10,800000000000000000000000000000
    10,600000000000000000000000000000
    10,400000000000000000000000000000
    10,200000000000000000000000000000
    10,000000000000000000000000000000
    9,799999999999990000000000000000
    9,599999999999990000000000000000
    9,399999999999990000000000000000
    9,199999999999990000000000000000
    8,999999999999990000000000000000
    8,799999999999990000000000000000
     
    Если потянуть изначально _вверх_, то без девяток, но если потянуть _вверх_  поменяв предварительно местами первые два числа, то опять появяться девятки:
    8,799999999999990000000000000000
    8,999999999999990000000000000000
    9,199999999999990000000000000000
    9,399999999999990000000000000000
    9,599999999999990000000000000000
    9,800000000000000000000000000000
    10,000000000000000000000000000000
    10,200000000000000000000000000000
    10,400000000000000000000000000000
    10,600000000000000000000000000000
    10,800000000000000000000000000000
     
    Как от этого избавиться?

    Всего записей: 161 | Зарегистр. 09-11-2005 | Отправлено: 15:00 13-09-2006
    SERGE_BLIZNUK

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

    Цитата:
    Есть ряд переменных: StepPrice_n1, StepPrice_n2, ... StepPrice_nn со своими числовыми значениями.  

    Никак!
    изначально неверная постановка задачи...
    нужно заводить массив Dim StepPrice_n ( ) - массивы как раз для этого и придумали.
     
    можно, если очень хочется, извернуться через пользовательскую функцию и глобальные переменные вот так
     
    а цикл вы неправильно написали Next i надо ;-))
     
    Добавлено:

    Цитата:
    9,399999999999990000000000000000  
    9,599999999999990000000000000000  
    9,800000000000000000000000000000  

     

    Цитата:
    Как от этого избавиться?

    ну, как вариант, можно округлить до заданной точности.

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 17:42 13-09-2006
    Funt123



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

    Цитата:
    а цикл вы неправильно написали Next i надо )  

    ну это я здесь опечатался.

    Цитата:
    нужно заводить массив Dim StepPrice_n ( ) - массивы как раз для этого и придумали.

    А как массиввом это провернуть. Я начал писать и что-то ошибка стала появляться:
    Dim StepPrice("00", "20", "40", "60", "80") As String
    MsgBox StepPrice(1)
     
    Выводит ошибку "Wrong Number of dimensions"
     
     
    Добавлено:

    Цитата:
    пользовательскую функцию

    Функция прикольная, спасибо, но для моего случая слишком громоздко

    Всего записей: 161 | Зарегистр. 09-11-2005 | Отправлено: 18:35 13-09-2006
    opx

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

    Всего записей: 5 | Зарегистр. 13-09-2006 | Отправлено: 19:15 13-09-2006
    Funt123



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    opx
     
    а простым реплейсингом не получается? В смысле Найти и Заменить через меню.
    А если кодом, то можно записать макрос после ручной обработки.

    Всего записей: 161 | Зарегистр. 09-11-2005 | Отправлено: 19:30 13-09-2006
    SERGE_BLIZNUK

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

    Цитата:
    Вопрос такой как найти и самое главное скопировать куда либо (в лист бокс, лэйбл, на другой лист или еще куда) ячейки имеющие 11 или гг

    написать макрос на VBA :-)))
    попозже постараюсь сделать.
     
    Funt123

    Цитата:
    Dim StepPrice("00", "20", "40", "60", "80") As String  
    MsgBox StepPrice(1)  

     
    ну, не так быстро...
    надо так:

    Код:
     
      Dim StepPrice(5) As String
      StepPrice(1) = "00": StepPrice(2) = "20"
      StepPrice(3) = "40"
      StepPrice(4) = "60": StepPrice(5) = "80"
       
      MsgBox StepPrice(1)
     

     

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



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

    Код:
    For Each c In Selection
        If InStr(c.Value, "11") > 0 Or InStr(c.Value, "гг") > 0 Then
            c.Offset(0, 1).Value = c.Value
        End If
    Next

    Selection можно заменить на конкретную область (Range("A1:A10"), например).
    Что потом с ними делать зависит от того, куда копировать.
     
    Можно и без VBA обойтись. например, через формулу
    =AND(ISERROR(FIND("11",A1)),ISERROR(FIND("гг",A1)))
    и автофильтр. Извиняюсь, что формула на английском, если надо, можно перевести.
     
    Funt123
    Или так:

    Код:
    Dim StepPrice As Variant
    StepPrice = Array("00", "20", "40", "60", "80")
    MsgBox StepPrice(1)


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 21:36 13-09-2006
    Funt123



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    ок. то что и хотел, просто Array не нашел в списке объектов. Это что, недокументированная функция?
    SERGE_BLIZNUK
    ок. так и сделал. Спасиб.

    Всего записей: 161 | Зарегистр. 09-11-2005 | Отправлено: 22:13 13-09-2006
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    opx
    приведу свой вариант,
    конечно у господина Yuk лаконичнее, но я и не собираюсь тягаться с профи...
    (Yuk, моё почтение ;-)))
     
    мой вариант копирует найденные в выделенном диапазоне на "Лист2" (имя листа можно задать своё в самой процедуре)
    в самый низ Листа2, в один столбец значение ячейки, в которой содержится "11" или "гг", в соседний - адрес в виде Строка: Колонка
    Подробнее...
    удачи.  
     

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



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

    Цитата:
    Array не нашел в списке объектов. Это что, недокументированная функция?

    Это именно функция, а не объект. А почему недокументированная? В хелпе есть.
     
    SERGE_BLIZNUK
    Кончай прибедняться!

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 22:28 13-09-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