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

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mcree
    Отвечаю на 2-й вопрос.
    Цитата:
    2. Есть набор ComboBox, в которые всталяем значения. Как можно закрутить этот кусочек в цикл, подставляя в каждом номер комбобокса. (В реальной задаче их больше 50). Комбобоксы находятся прямо на листе, а не в форме.

    Комбобоксы и другие контроли на листе входят в коллекцию Shapes. Проблема в том, что в эту коллекцию падают все посторонние объекты на листе, которые могут иметь разные свойства, и разделить объекты по типу не так просто. Можно, конечно, использовать имя объектов (.Name), но тогда надо не забывать включать тип в имя (в принципе, по умолчанию так и есть, например, Combobox1).
     
    Вот более универсальный метод:
    Код:
    Sub LoopThroughComboBoxes()
    For Each shp In ActiveSheet.Shapes
    If shp.Type = msoOLEControlObject Then
        If InStr(shp.OLEFormat.progID, "ComboBox") > 0 Then
            shp.Height = 30
            shp.Left = 50
            shp.OLEFormat.Object.Object.AddItem "abc"
        End If
    End If
    Next
    End Sub


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 06:53 30-09-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Переношу из Excel FAQ:
     
    Sergey MSN
    Цитата:
     У меня на основе данных из базы данных создается wokbook в котором может быть очень много графиков. Для всех графиков мне бы хотелось, чтобы пользователь мог doubleclick на него и получить некоторые подробности. Для одного конкретного chart все работает, но как это заставить работать для всех chart одиноковым образом?
     
    Если я правильно вас понял, с вашим методом все равно в каждом chart надо что-то прописывать. С тем же успехом я могу туда прописать event  в чистом виде.  
    Разница только в ОБЪЕМЕ кода. Т.е. это работает, но это не элегантно. Sorry, если ошибаюсь.
     
    А мне не хочеться плодить сущности без нужды.

    Очередная задача, решаемая с помощью классов. Идея в том, чтобы для каждой диаграммы создать объект нового класса, в котором и прописать, как диаграмма должна откликаться на события. Функция обработки события описывается только один раз в классе. Все что надо сделать - пройтись макросом по всем диаграммам в книге и создать для них объект класса. Например, так:

    Код:
    'Вверху модуля определяем коллекцию объектов
    Dim myChartCol As Collection
         
    Sub Charts2Class()
    Dim ch As New myChartClass
    Set myChartCol = New Collection
    'Для диаграмм отдельным листом
    For Each s In ActiveWorkbook.Charts
        Set ch.myChart = s
        myChartCol.Add ch
        Set ch = Nothing
    Next
    'Для диаграмм, встроенных в листы
    For Each s In ActiveWorkbook.Worksheets
        For Each co In s.ChartObjects
            Set ch.myChart = co.Chart
            myChartCol.Add ch
            Set ch = Nothing
        Next
    Next
    End Sub

     
    Теперь собственно класс (назовем его myChartClass):
    Код:
    Public WithEvents myChart As Chart
     
    Private Sub myChart_BeforeDoubleClick(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean)
        MsgBox myChart.Name
        Cancel = True
    End Sub

     
    При изменении класса и при добавлении новых диаграмм надо опять запускать макрос. Если диаграмма отдельным листом, можно сделать обработку события Workbook_NewSheet. А вот как отреагировать на событие новой диаграммы в листе, к сожалению не нашел. Кто-нибудь знает?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 09:43 01-10-2006 | Исправлено: Yuk, 09:46 01-10-2006
    DesperadoZ



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

    Код:
     
    Public a
    Function znach(stolb, stroka, put)
     
    ' stolb и stroka - адрес ячейки
    ' put путь к файлу
    ' данные лежат на листе : Лист1.
     
        a = ???????
     
        If Application.IsNA(a) Then znach = 0 Else znach = a
     

    Всего записей: 104 | Зарегистр. 22-07-2006 | Отправлено: 14:57 01-10-2006
    Sergey MSN

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk.
    Огромное спасибо - разобрался. Ура все работает. Повесил все на Workbook_Open.
     
    Только есть в вашем примерчике принципиальная ошибка.
     
    В collection надо схранять не класс Chart, а новый нами созданный класс
    Т.е. не  
    myChartCol.Add ch
    а
    myChartCol.Add s
     
    Я так понял, что collection здесь нужен только для того, чтобы сделать время жизни экземпляров нового класса глобальным.  
     
    Перелопатил все доки кторые  нашел. За что я обожаю Мелкософт, так это за точную и толковую документацию
    Куча идиотских примеров типа шелкните мышкой здесь, напишите слово здесь и ни одного толкового объяснения как это работает.

    Всего записей: 5 | Зарегистр. 30-09-2006 | Отправлено: 15:40 01-10-2006
    TNR



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ кто подскажет как можно сделать чтобы  находясь в Excel запустить архивирование самого себя и копирование его на дискету ?

    Всего записей: 1761 | Зарегистр. 15-03-2004 | Отправлено: 05:18 02-10-2006
    Yuk



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

    Цитата:
    Только есть в вашем примерчике принципиальная ошибка.
    В collection надо схранять не класс Chart, а новый нами созданный класс

    Дык у меня ch и есть наш класс:
    Цитата:
    Dim ch As New myChartClass

     
    TNR
    Заархивировать сaмого себя в экселе - это круто!
     

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 06:54 02-10-2006
    PavelO

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет! Подскажите пожалуйста, как задействовать мышинное колесо в Мультипэйдж (Чтобы скрол бар им прокручивать) . Искал и в Хелпах и в Гуглах Только вот ничего не нашел

    Всего записей: 27 | Зарегистр. 19-09-2006 | Отправлено: 21:37 02-10-2006
    mcree

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Спасибо за подсказку. Оказалось, что в функции я потерял строку с присваиванием a=True. Из-за этого ана не работала.
    Представленый вами код, почему-то не срабртал. Да и , как я понял, он возьмет диапазон до конца електронной таблицы. А мне нужно только не пустые строки.
    Спасибо за подсказку с раскрывающимся списком. Его использование должно капитально сократить код. Но еще нужно подумать ... Я вроде не нашел события на выбор из списка, а оно в моей задаче нужно.
    Если у кого-то будут еще предложения буду очень благодарен.

    Всего записей: 2 | Зарегистр. 29-09-2006 | Отправлено: 21:51 02-10-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    PavelO
    Посмотри здесь:
    http://www.mvps.org/dmcritchie/excel/scrollbar.htm
    Может, этот фикс нужен:
    http://office.microsoft.com/en-au/assistance/HA101175901033.aspx
     
     
     
    Добавлено:
    mcree

    Цитата:
    Представленый вами код, почему-то не срабртал. Да и , как я понял, он возьмет диапазон до конца електронной таблицы. А мне нужно только не пустые строки.

    Нет, до первой непустой ячейки в строке, начиная от А1. Если А2 пустая, до первой непустой. Так же, как использовать клавишу End.  
     

    Цитата:
    Я вроде не нашел события на выбор из списка

    Событие Worksheet_Change. Анализируй переменную Target с If Target.Address или Select Case для многих ячеек. Иногда удобно использовать функцию Intersect. Просмотри этот топик, было много примеров.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 22:11 02-10-2006
    Vladimir54

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    "Думаю, надо делать через обработку события Change листа. Условие типа  
    If Not IsEmpty(Target) Then"
    Чем не походит условие, которое я привел?  
    *****************************************
    Yuk
     
    Извините, попробую расписать попонятнее.
     
    Ячейка "первого листа А1" должна переноситься в "ячейку второго листа А1" в том случае, если у соседней "ячейки первого листа А2" стоит любое ненулевое числовое значение, следовательно, "ячейка второго листа А1" автоматом  должна блокироваться (подразумевается, что стоит защита на листе, галочка на блокирование с этой ячейки должна сниматься  или ставиться взависимости от значения в соседней "ячейке первого листа А2" ) и менять или не менять цвет на "красный" (взависимост от значения в ячейке А2) уже после переноса на другой лист (такое извращение приходится придумывать для бухгалтеров).  
    Открываю макрос и пишу:
    If Not IsEmpty(Target)  (Какое нужно указать условие допустим неравно нулю,как это сделать  что значит not IsEmpty)Then А1 переносится значение на А1 во второй лист + ставится блокровка и красный цвет иначе должно переноситься пустое значение и ячейка автоматом должна разблокироваться и поменять цвет на черный.  
    Помогите полностью записать код...

    Всего записей: 868 | Зарегистр. 06-11-2005 | Отправлено: 00:49 03-10-2006 | Исправлено: Vladimir54, 19:07 04-10-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Vladimir54
    Несколько раз перечитал и ничего не понял. Давайте еще раз. Желательно по-русски, без пропуска слов и со знаками препинания. Представьте, что вы объясняете для своих бухгалтеров.  

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 01:13 03-10-2006
    Troll

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

    Код:
     Sub Cell2Text()
    Dim c As Range
    Dim fs, f
    Set fs = CreateObject("Scripting.FileSystemObject")
    For Each c In Range("A1:A2")
        Set f = fs.CreateTextFile(c.Text & ".txt", True)
        f.writeline "[enter]"
        f.writeline "[wait inp inh]"
        f.writeline "wait 10sec until FieldAttribute 0000 at (3.22)"
        f.writeline "wait 10 sec until cursor at (3.23)"
        f.writeline "[wait app]"
        f.writeline Chr(34) & c.Text & Chr(34)
        f.Close
    Next
    End Sub
     
    Было не понятно, нужен вывод в один файл или в отдельный файл для каждого счета. Сделал для каждого. Если нужно в один, вынеси за цикл создание файла и закрытие.
     
     
    Добавлено:
    Да, не забудь изменить область ячеек, откуда брать значения в Range("A1:A2"). Если нужна динамическая область, смотрим (или задаем вопрос) в соответствующем топике.  

     
    1. Надо чтоб создавался один файл
    2. Да нужна естественно динамическая область, но начиная с A1 до бесконечности, в принципе там счетов 500, можно и ручками сразу прописать, не принципиально.
    спасибо за совет и заранее за новый совет;)
     

    Всего записей: 115 | Зарегистр. 04-11-2003 | Отправлено: 05:10 03-10-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troll
    Изменений немного:
    Код:
    ...
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.CreateTextFile("output.txt", True)
    For Each c In ActiveSheet.UsedRange.Columns(1).Cells
        f.writeline "[enter]"
        ...
        f.writeline Chr(34) & c.Text & Chr(34)
    Next
    f.Close
    End Sub  

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 09:55 03-10-2006
    sonix555



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет! Не могу понять... Есть такой простой макрос:
    -------------------------------------
    Private Sub Workbook_Open()
    Dim RN As Integer, CN As Integer, SumCh As Byte, ch As Byte
     
    RN = 240
    CN = 2
     
    Do Until Cells(RN, CN) = 200
    RN = RN - 1
    If Cells(RN, CN) <> "" Then
     SumCh = 0
        For CN = 4 To 7
            If Cells(RN, CN) = "" Then
             ch = 0
            Else: ch = 1
            End If
         SumCh = SumCh + ch
        Next CN
     
        If SumCh = 0 Then
         Columns(RN).Select
         Selection.EntireColumn.Hidden = True
        End If
    End If
    Loop
     
    End Sub
    --------------------------
     
    При открытии книги вылазит 1004 Error: "Application-defined or object-defined error"
    Иду в дебуг при ошибке. Тормозится на начале цикла, причем значения RN и CN - 0 и 8 соответственно. А если прогонять макрос трассировкой, то все прекрасно выполняется.
    Че за лажа?

    Всего записей: 8 | Зарегистр. 03-07-2006 | Отправлено: 15:56 04-10-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sonix555
    По всей видимости во 2-м столбце нет ячейки со значением 200.
    Рекомендую явно прописать какой лист активировать Sheets(1).Activate. Или так: Sheets(1).Cells(RN,CN).Value

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:17 04-10-2006
    Vladimir54

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

    Всего записей: 868 | Зарегистр. 06-11-2005 | Отправлено: 21:57 04-10-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Vladimir54
    Спасибо, уже более менее.
    Если я правильно понял, надо обрабатывать событие изменения ячейки А2 1-го листа.
    Тогда в код 1-го листа примерно такой код:
    Код:
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$2" Then
      If Not IsEmpty(Target) And IsNumeric(Target.Value) Then
        With Sheets(2).Cells(1, 1)
            .Value = Sheets(1).Cells(1, 1).Value
            .Locked = True
            .Font.ColorIndex = 3
        End With
        Sheets(1).Cells(1, 1).Value = ""
      End If
    End If
    End Sub

    Если нет опиши подробно шаги. Когда открываешь книгу, какие ячейки заполнены, их состояния. Куда и в какой последовательности осуществляется ввод. Защищен ли 2-й лист?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 22:58 04-10-2006
    TNR



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как сделать в Excel кнопку при нажатии на которую файл будет паковаться и копироваться на дискету ?

    Всего записей: 1761 | Зарегистр. 15-03-2004 | Отправлено: 05:51 05-10-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    TNR
    См. функцию Shell в VBA. Запуск внешних программ. Запускаешь архиватор как из командной строки или через батник.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 06:05 05-10-2006
    TNR



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    создал cmd файл там прописал параметры запаковки, а он не запускается !
    файл находиться в одной папке с файлом excel.
    Как его заставить запускать этот cmd ?

    Всего записей: 1761 | Зарегистр. 15-03-2004 | Отправлено: 06:23 05-10-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