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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    Эх... спасибо Уже на перле написал.

    ----------
    * * *

    Всего записей: 7080 | Зарегистр. 20-11-2003 | Отправлено: 16:34 05-03-2007
    tec4

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

    Цитата:
    tec4  
    Вот такой макрос повесь на кнопку (кнопку ты сам на лист поставь  ):  
     
    Код:Sub itog()  
        Cells(Rows.Count, 1).End(xlUp).Offset(1) = _  
        WorksheetFunction.Sum(Columns(1))  
    End Sub  
     
    Жирные единички - это номер столбца. Для столбца B будет 2, C -3 и т.д.

     
    Спасибо большое! Попробую.

    Всего записей: 12 | Зарегистр. 02-03-2007 | Отправлено: 05:41 06-03-2007
    ivanovoleg79

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Имеется следующий макрос
     
    Sub FiveMinutDiagramUpdate()
        i = 6
        StartRange1 = StartRange1Base + DataCount * i
        StartRange2 = StartRange2Base + DataCount * i
        StartRange3 = StartRange3Base + DataCount * i
        TextRange0 = "R181C1:R211C1"
        Worksheets(1).Activate
        Set SeriesRange0 = Range(Cells(StartRange1, 1), Cells(StartRange1 + DataCount, 1))
        Set SeriesRange1 = Range(Cells(StartRange1, 2), Cells(StartRange1 + DataCount, 2))
        Set SeriesRange2 = Range(Cells(StartRange2, 2), Cells(StartRange2 + DataCount, 2))
        Set SeriesRange3 = Range(Cells(StartRange3, 2), Cells(StartRange3 + DataCount, 2))
        Charts(1).Activate
        ActiveChart.SetSourceData Source:=Union(SeriesRange0, SeriesRange1, SeriesRange2, SeriesRange3), PlotBy:=xlColumns
    End Sub
    ~~~
    для простоты переменная, значение которой вводится пользователем заменена на i
    ~~~
    В таком виде работает и у пользователей вроде пока еще нет замечаний, но ....
    Меня неудовлетворяют следующие строки (хотелось бы без них обойтись)
        Worksheets(1).Activate
        Charts(1).Activate
    Три дня пытаюсь что-то сделать - ошибки...

    Всего записей: 2 | Зарегистр. 06-03-2007 | Отправлено: 16:56 06-03-2007
    The okk



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

    Цитата:
    Sub FiveMinutDiagramUpdate()  
        i = 6  
        StartRange1 = StartRange1Base + DataCount * i  
        StartRange2 = StartRange2Base + DataCount * i  
        StartRange3 = StartRange3Base + DataCount * i  
        TextRange0 = "R181C1:R211C1"  
        Worksheets(1).Activate  
        Set SeriesRange0 = Range(Cells(StartRange1, 1), Cells(StartRange1 + DataCount, 1))  
        Set SeriesRange1 = Range(Cells(StartRange1, 2), Cells(StartRange1 + DataCount, 2))  
        Set SeriesRange2 = Range(Cells(StartRange2, 2), Cells(StartRange2 + DataCount, 2))  
        Set SeriesRange3 = Range(Cells(StartRange3, 2), Cells(StartRange3 + DataCount, 2))  
        Charts(1).Activate  
        ActiveChart.SetSourceData Source:=Union(SeriesRange0, SeriesRange1, SeriesRange2, SeriesRange3), PlotBy:=xlColumns  
    End Sub  


    Цитата:
    Меня неудовлетворяют следующие строки (хотелось бы без них обойтись)  

    Только эти?

    Код:
    Sub FiveMinutDiagramUpdate()
        i = 6
        StartRange1 = StartRange1Base + datacount * i
        StartRange2 = StartRange2Base + datacount * i
        StartRange3 = StartRange3Base + datacount * i
        TextRange0 = "R181C1:R211C1"
        With Worksheets(1)
        Set SeriesRange0 = .Cells(StartRange1, 1).Resize(datacount, 2)
        Set SeriesRange2 = .Cells(StartRange2, 2).Resize(datacount)
        Set SeriesRange3 = .Cells(StartRange3, 2).Resize(datacount)
        End With
        Charts(1).SetSourceData Source:=Union(SeriesRange0, _
        SeriesRange2, SeriesRange3), PlotBy:=xlColumns
    End Sub


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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk, большое спасибо (сегодня уже начал читать про Resize & Offset)
    Как всегда решение на поверхности, которое сам не увидел.

    Всего записей: 2 | Зарегистр. 06-03-2007 | Отправлено: 19:08 06-03-2007
    olinka1986



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ogromnoe vsem spasibo...Ja razobralas..urraa..zarabotalo!! ))

    Всего записей: 3 | Зарегистр. 04-03-2007 | Отправлено: 21:36 06-03-2007
    tavit1

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет!
    пишу в UserForm2:
    обьявляю глобально:
    Public r As Date
     
    затем:
    Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
      r = UserForm2.MonthView1.Value
    Unload UserForm2
    End Sub
     
    теперь в модуле:
    Private Sub Макрос2()
    UserForm2.Show
    n = UserForm2.r
    MsgBox n
    End Sub
     
    В итоге выдаёт 0:00:00 а должна быть нажатая в календаре дата,где ошибка?

    Всего записей: 2 | Зарегистр. 07-03-2007 | Отправлено: 06:30 07-03-2007
    The okk



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

    Код:
    Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
        UserForm2.Hide
    End Sub
     
    Private Sub Макрос2()
        MsgBox UserForm2.MonthView1.Value
    End Sub

    Я так понял, показывать форму во втором макросе не обязательно?
    А ошибка в том, что после окончания работы макроса переменная r не сохраняет значение. Чтобы сохраняла, ее нужно объявлять, как статическую (Static). А в коде, который я привел, переменная не нужна - значение можно брать прямо из формы, потому что она не выгружается, а просто прячется.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 06:59 07-03-2007 | Исправлено: The okk, 07:05 07-03-2007
    tavit1

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо UserForm2.Hide не хватало
    А всё-таки если нужно будет выгрузить форму и оставить в памяти переменную
    на моём примере как это будет выглядеть ?
     
    пробовал в UserForm2:
     
    Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
     Static r As Date
     r = UserForm2.MonthView1.Value
    Unload UserForm2
    End Sub
     
    теперь запускаю форму из модуля:
     
    Private Sub Макрос2()  
    UserForm2.Show  
    n = UserForm2.r  
    MsgBox n  
    End Sub  
     
    переменной r нет в памяти.

    Всего записей: 2 | Зарегистр. 07-03-2007 | Отправлено: 12:40 07-03-2007
    The okk



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

    Цитата:
    А всё-таки если нужно будет выгрузить форму  

    А зачем?

    Цитата:
    оставить в памяти переменную  
    на моём примере как это будет выглядеть ?  

    На твоем наверное никак, поскольку в данном коде:

    Цитата:
    Private Sub MonthView1_DateClick(ByVal DateClicked As Date)  
     Static r As Date

    r (статическая) будет локальной переменной и не может быть использована в других процедурах (в частности, в Макрос2()). Её значение сохраняется только для процедуры, в которой она объявлена.  
    Вообще, я не советую использовать static, если можно прекрасно обойтись без него.

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Кто подскажет? В экселевской книге есть два листа:Комплектующие и периферия, где дан список (данная таблица занимает диапазон А:F) и Оглавление, где в столбце А указаны категории, например, Серверы НИКС, Компьютеры NIX на базе Intel и т.д. Вообще то это прайс NIX.zip, который скачан с www.nix.ru. Оглавление создано в виде гиперссылок, при нажатии на которые открывается лист Комплектующие и периферия (записей 6829) и выделяется диапазон согдасно оглавления (записей 351).
    Вопрос. Кто поможет написать код (если это конечно, возможно), чтобы при выделении гиперссылки(оглавление) это оглавление (название) добавлялось бы в выделенный диапазон по столбцу I. А было бы лучше, если бы сразу при нажатии, например, кнопки Присвоить категорию, всему списку по столбцу I добавилась бы соответствующая категория (оглавление).  
    Данный прайс используется в акцесевской базе (связь с экселевским файлом), где нужно, чтобы комплектующим и периферии была присвоена соответствующая категория (оглавление). Это нужно для дальнейшего создания базы.
     
    Помогите, пожайлуста!

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 18:12 07-03-2007
    Pantera3587

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Дополнение к предыдущему вопросу. Делаю форму, куда помещаю ListBox (ListBox1) и кнопку (CommandButton1). Для кнопки назначаю код:
    Private Sub CommandButton1_Click()
    Dim UsedRange As Range
    Dim w As Variant
    Dim w1 As Variant
    Dim i As Integer
    Dim j As Integer
    Set w = Sheets("Комплектующие и периферия")
    Set w1 = Sheets("Оглавление")
     
    j = ListBox1.Text
    For i = 1 To w.UsedRange.Rows
    w.Cells(UsedRange.Rows, 7).Value = j
    Next i
    End Sub
    Не могу сообразить, как мне назначить для выделенного текста из списка соответствующее значение с листа Оглавление. Смысл в следуюущем: выделяя соответствующий текст в в списке и нажимая кнопку должен выделится соответствующий диапазон на листе Комплектующие и периферия и рядом с выделенным диапазоном (в  столбце F) вставится текст выделенный в списке во все ячейки выделенного диапазона листа Ком и пер..

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 17:46 08-03-2007
    DonkeyHottt

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть макрос, хранящийся в "Личной книге макросов" При его выполнении в ячейки одного (активного) листа книги, например A1 F3 H8, записываются данные, например x y z, а мне нужно, чтобы все повторилось также во всех активных листах всех открытых книг - в те же ячейки - те же данные. Что нужно дописать в этом макросе? Заранее спасибо.

    Всего записей: 104 | Зарегистр. 26-12-2004 | Отправлено: 21:38 08-03-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DonkeyHottt
    Все ссылки вида Thisworkbook. или у которых не указана книга совсем (например ActiveWorkSheet) нужно заменить (дополнить) на ActiveWorkBook.
    для иллюстрации моих слов, попробуйте поместить в вашу книгу с макросами код:
      NameThis = ThisWorkbook.Name
      NameActive = ActiveWorkbook.Name
      MsgBox " NameThis = " & NameThis & " NameActive = " & NameActive
    и выполнить его, находясь в рабочей книге.

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 06:53 09-03-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DonkeyHottt
     
    Организуй цикл
     
        For i = 1 To Workbooks.Count
            If TypeName(Workbooks(i).ActiveSheet) = "Worksheet" Then
                 Workbooks(i).ActiveSheet.Range("A1").Value = x
                ...
            End If
         Next i
     

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 14:35 09-03-2007 | Исправлено: AndVGri, 14:45 09-03-2007
    DonkeyHottt

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    Спасибо! Однако узость моего мышления, применительно к VBA, к сожалению выставила Ваш, я уверен, ценный совет, за рамки моего восприятия. Но всеравно спасибо за Ваше постоянное участие и помощь в моих проблемах! Ближе моему пониманию оказался совет AndVGri
    AndVGri
    Все работает! Большое спасибо! Я понимал, что нужен цикл от первой до последней, но не знал синтаксиса команд. Скачал книжку "Использование макросов в Excel" С.Роман. Буду разбираться понемногу.
    Спасибо всем еще раз!

    Всего записей: 104 | Зарегистр. 26-12-2004 | Отправлено: 21:15 09-03-2007 | Исправлено: DonkeyHottt, 21:21 09-03-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DonkeyHottt
    Цитата:
    Спасибо! Однако узость моего мышления, применительно к VBA, к сожалению выставила Ваш, я уверен, ценный совет,
    эк загнул... ;-)))
    Цитата:
    Но всеравно спасибо за Ваше постоянное участие и помощь в моих проблемах! Ближе моему пониманию оказался совет AndVGri  
    Извини, если не понял твою проблему...
    Просто код, который перебирает все открытые книги я уже тебе  приводил здесь.
    т.е. вышеуказанный AndVGri код можно записать и так:
    Код:
     
     For Each w In Workbooks  
       w.ActiveSheet.Range("A1").Value = x  
     Next  

     
    p.s. кстати, поясните мне, господа, а зачем проверять тип книги ?  
    (TypeName(Workbooks(i).ActiveSheet) = "Worksheet") - всё равно Personal.xls имеет такой же тип... и в него тоже запишется значение x
     
     

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    Если я правильно понял задачу, примерно так:

    Код:
    Private Sub CommandButton1_Click()
    Dim w As Worksheet
    Dim w1 As Worksheet
    Dim c As Range, sel As Range
    Dim j As Integer
    Dim hAddr As Variant
     
    Set w = Sheets("Комплектующие и периферия")
    Set w1 = Sheets("Оглавление")
     
    j = ListBox1.ListIndex + 1
    hAddr = Split(w1.Hyperlinks(j).SubAddress, "!")
    Set sel = w.Range(hAddr(1))
    sel.Select
    For Each c In sel.Offset(0, 8).Resize(sel.Rows.Count, 1)
        c.Value = ListBox1.Text
    Next
    Unload Me 'Это для выгрузки формы, если надо. Или отдельную кнопку для закрытия.
    End Sub
     

    Если этот же код вставить в Private Sub ListBox1_Click(), то кнопка вообще не понадобится.
    Удачи.
     
     
    Добавлено:
    SERGE_BLIZNUK

    Цитата:
    а зачем проверять тип книги ?

    На случай, если ActiveSheet - Chart.

    Цитата:
    Personal.xls ... и в него тоже запишется значение x  

    А вот это правильно. Можно проверить или название, или является ли лист спрятанным:
    If w.Windows(1).Visible Then

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 09:57 10-03-2007 | Исправлено: Yuk, 10:15 10-03-2007
    Pantera3587

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Большое спасибо за помощь. То, что надо.

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 21:51 10-03-2007
    Lexy4ka

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте!
    в университете задали задание по программированию для Excel  в VBA
    По правде говоря в этом деле я свосем не сильна. Но уж очень не хочется упасть в грязь лицом. половину задания знаю как делать а вот с оставшейся хуже.
    задание следующее:
    1.    Разработать форму и элементы управления для табулирования значений функции:
    a.    y= a*Sin(sin(x+Tg x )).
    2.     Для ввода аргумента функции использовать его начальное, конечное значение и шаг изменения. Если начальное значение больше конечного выдавать сообщение со значением шага.
    3.     Таблицу - результат поместить на новый лист существующей книги, который назвать «Табулирование».  
    4.    Найти среднее гармоническое, тех из данных, которые > 0 (или слово “ нет”), число данных, больших среднего гармонического тех из данных, которые > 0 и  помес-тить их под таблицей.
    5.     Заголовок  разместить над таблицей, выделив его полужирным шрифтом размером 14.  
    6.    Произвести форматирование таблицы: к столбцам «аргумент» и «функция» применить различную заливку.  
    ___________________________________________________
    не могу понять как сделать чтобы вводя в форме начальное и конечное значения а так же шаг, заполнялся один столбец в пределах этих значений с соответствующим шагом в документе с excel.
     
    поготи пожалуйста, заранее очень благодарна

    Всего записей: 3 | Зарегистр. 11-03-2007 | Отправлено: 00:27 11-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