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

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Спасибо тебе за хлопоты. Твой макрос не подошел. Но я таки справился просто беру первую строчку и сравниваю с остальными по ходу дела все "х" заменяя числами. Потом вторую строчку сравниваю со всем и т.д.

    Всего записей: 539 | Зарегистр. 04-07-2002 | Отправлено: 12:30 25-09-2006
    virginijus

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AT29=переменная - буквы (а,б,в,г....), BF23:CF23=буквы (а,б,в,г....), BF25:CF25=значение ячеек BF23:CF23 (цифры)
    =LOOKUP(AT29;BF23:CF23;BF25:CF25)
     
    Прошу помочь с макросом так как =LOOKUP(AT29;BF23:CF23;BF25:CF25) не идет. т.е при написании в AT29 букву "а", не находит значение в векторе BF25:CF25. Функцию IF не могу использоват т.к. в BF23:CF23 много значении. Спасибо

    Всего записей: 125 | Зарегистр. 21-06-2005 | Отправлено: 15:56 25-09-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    virginijus
    Должно работать. Ищи у себя тараканов.
    Проверь русские или английские буквы используются? Например, А русскую и английскую легко перепутать. Имей в виду, что для LOOKUP данные в BF23:CF23 должны быть отсортированы. Также если нет точного совпадения, возвращается ближайшее меньшее.
    Можно также использовать функции HLOOKUP или INDEX/MATCH:
    =HLOOKUP(AT29;BF23:CF25;3;FALSE)
    =INDEX(BF25:CF25;MATCH(AT29;BF23:CF23;0))
    Нужно найти только одно значение или заполнить таблицу? В последнем случае необходимо установить абсолютные ссылки.
    Макрос написать не сложно, но я бы не делал это для данной задачи.

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    всем привет и прошу помощи
    очень нужно было написать несколько макросов для заполнения документов (типовые бланки), долго рассказывать и проще показать. В общем при закрытии файла постоянно вылетает сообщение об ошибке и Excel перегружается. В чем проблема никак не найду. Может кто из Титанов глянул бы критически - я был бы безмерно благодарен. Весит это чудо около 900 кб. Если кто может помочь, отпишите на aleksej71@gmail.com, вышлю свое "творчество". Заранее спасибо огромное...

    Всего записей: 1 | Зарегистр. 25-09-2006 | Отправлено: 21:06 25-09-2006
    virginijus

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    To Yuk
    Огромное СПАСИБО за ликбез, оказываетьса надо было отсортировать буквы.  

    Всего записей: 125 | Зарегистр. 21-06-2005 | Отправлено: 09:10 26-09-2006
    Canibal

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ помогите с проблемой.  
    Получилось так, что мне нужно выгрузить данные из 1С в Excel, в котором есть процедура проверки правильности заполнения ячеек (Worksheet_Change()) ну и соответственно при выгрузке, когда значению ячейки присваиваю "неправильное" значение он ругается и все время приходится жать ОК перед открытием книги, как можно программно отключить выполнение этой проверки пока я заполняю ячейки???
     
    Спасибо

    Всего записей: 2 | Зарегистр. 26-09-2006 | Отправлено: 14:43 26-09-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Canibal
    В любом файле в VBA редакторе создай новый модуль и скопируй туда:

    Код:
    Sub EventsOff()
    Application.EnableEvents = False
    End Sub
     
    Sub EventsOn()
    Application.EnableEvents = True
    End Sub

     
    Макрос EventsOff выключит обработку событий. Не забудь включить обратно с помощью EventsOn.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 15:24 26-09-2006
    Canibal

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
     
    Огромное спасибо!! Два дня искал! Спасибо!

    Всего записей: 2 | Зарегистр. 26-09-2006 | Отправлено: 15:37 26-09-2006
    virginijus

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите с макросом, ситуация такая - необходимо, чтобы при появлении записи в ячеке А1 - "Субота", В2 - "Воскресение" , ячеики А2:A5, B2:B5 стали красными. Спасибо
     
    Добавлено:
    Простите, предидущем посту ошибочка
    Помогите с макросом, ситуация такая - необходимо, чтобы при появлении записи в ячеке А1 - "Субота", В1 - "Воскресение" , ячеики А2:A5, B2:B5 стали красными. Спасибо

    Всего записей: 125 | Зарегистр. 21-06-2005 | Отправлено: 15:54 26-09-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    virginijus
    А точно нужен макрос, может проще через условное форматирование?
     
    Добавлено:
    Как определить наличие объекта (рисунка) на листе? Макросом вставляю на лист картинку, хочу проверить ее наличии там, чтобы не вставить  повторно.

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 19:30 26-09-2006
    virginijus

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А как это через условное форматирование? через ЕСЛИ ? Дело в том, что  "Субота", "Воскресение" может окозаться допустим в интервале от А1 до АЕ1 в зависимости от года и месеца. Уточню- имеетса такая ситуация
     
    Пн  Вт  Ср   Чт  Пт  Сб  Вс  Пн  Вт  Ср   Чт  Пт  Сб  Вс....
     
    A2  B2  C2  D2  E2  F2  G2  H2.....
    A3  B3......
    .....
     
    Необходимо чтобы столбцы (в данном случае F2:F50, G2:G50) покраснели, в след. месяце Сб  Вс выпадет на D1  E1 значит должны покраснеть D2:D50, E2:E50 и т.д.
    Мне кажется через ЕСЛИ это невозможно или я ошибаюсь?  

    Всего записей: 125 | Зарегистр. 21-06-2005 | Отправлено: 20:48 26-09-2006
    Yuk



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

    Код:
    =OR(A$1="Сб",A$1="Вс")
    Применить на все ячейки.
     
    Добавлено:
    DONRU1

    Цитата:
    Как определить наличие объекта (рисунка) на листе?

    Код:
    If ActiveSheet.Pictures.Count > 0 Then


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 21:14 26-09-2006 | Исправлено: Yuk, 21:25 26-09-2006
    virginijus

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk  
    Код:=OR(A$1="Сб",A$1="Вс")  
    Применить на все ячейки.
     
    Не понял, от чего ячеика должна  покраснеть?
     
    Добавлено:
    Макросы в excell книга C. Роман, кому надо, изучаите:
    http://rapidshare.de/files/34597806/Macros_Excel_VBA.djvu.html
     
    Добавлено:
    Ну вроде разобрался:
     
    Sub Tusuoti_Click()
    Dim S As String
    Dim S1 As String
    Dim I
    Dim Z
    S = "Sekmadienis"
    S1 = "Ðeðtadienis"
    Range("F17:aj108").Select
    With Selection.Interior
    .ColorIndex = 0
    End With
    For I = 0 To 30
    Range("F15").Select
    If Selection.Offset(0, I) = S Or Selection.Offset(0, I) = S1 Then
    Selection.Offset(1, I).Select
    For Z = 0 To 91
    Selection.Offset(1, 0).Select
    With Selection.Interior
    .ColorIndex = 15
    End With
    Next Z
    End If
    Next I
    End Sub

    Всего записей: 125 | Зарегистр. 21-06-2005 | Отправлено: 09:45 27-09-2006
    Yuk



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

    Цитата:
    Не понял, от чего ячеика должна  покраснеть?  

    См. Формат - Условный формат в меню

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 16:58 27-09-2006
    virginijus

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

    Всего записей: 125 | Зарегистр. 21-06-2005 | Отправлено: 16:28 28-09-2006
    PavelO

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk, привет. это снова я. У меня таки получилось с Image'ами, что рисунки вставляются в соответсвии с ячейками и именами файлов. Теперь возник вопрос такого характера: как определить на какой Image был сделан клик и вывести его на отдельную форму? Спасибо.
     
    Добавлено:
    PS: Как назначить Иконку курсору при наведении на Image. Пробовал в свойствах MouseIcon, выбирал нужный мне курсор, а он ноль эмоций, как будто и не назначал. Вот такая беда еще есть

    Всего записей: 27 | Зарегистр. 19-09-2006 | Отправлено: 13:05 29-09-2006
    unfreqient



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    При вставке рисунков, связывать их с макросом, типа  "Рисунок1_Щёлкнуть", а в макросе реализовать открытие формы и вставку выделенного рисунка на неё.

    Всего записей: 104 | Зарегистр. 20-07-2006 | Отправлено: 17:31 29-09-2006
    Yuk



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

    Цитата:
    Как назначить Иконку курсору при наведении на Image. Пробовал в свойствах MouseIcon, выбирал нужный мне курсор, а он ноль эмоций

    .MousePointer = 99 не забыл?
     

    Цитата:
    как определить на какой Image был сделан клик


    Цитата:
    При вставке рисунков, связывать их с макросом, типа  "Рисунок1_Щёлкнуть", а в макросе реализовать открытие формы и вставку выделенного рисунка на неё.

    Это правильно, но не будешь же описывать событие для объектов, которые вставляются динамически. Делается это через класс. Описывается новый класс, где прописывается реакция на события для всех объектов этого класса. Короче, проще показать.
     
    Создаем новый модуль класса (назовем его MyImageClass) с кодом:
    Код:
    Option Explicit
    Public WithEvents MyImage As MSForms.Image
     
    Private Sub MyImage_Click()
        MsgBox MyImage.Name
        'или другой код
    End Sub

     
    Затем в коде формы в область деклараций (наверху) вставляем:
    Код:
    Dim MyImageCol As Collection

     
    Затем в процедуру (например, инициализации формы):

    Код:
    Private Sub UserForm_Initialize()
    Dim img As MyImageClass ' это будет текущая картинка
    Dim i As Long, cnt As Long
    Dim c As Range
     
    Set MyImageCol = New Collection 'создаем коллекцию картинок, мы ее определили выше
    i = 1
    cnt = Sheets(1).UsedRange.Rows.Count
    'берем имена файлов картинок из 1-го листа
    'надо бы проверку файлов сделать, пока лень
    For Each c In Sheets(1).UsedRange  
        Set img = New MyImageClass 'создаем объект для текущей картинки
        Set img.MyImage = Me.Controls.Add("Forms.Image.1") 'добавляем картинку на форму
        With img.MyImage
            .Name = "Image" & i
            .Picture = LoadPicture(c.Text)
            .MousePointer = 99
            .MouseIcon = LoadPicture("C:\WINDOWS\Cursors\harrow.cur")
            .Top = Me.Height / cnt * (i - 1)
            .Height = Me.Height / cnt - 20
            .Left = 20
            .Width = Me.Width - 40
        End With
        MyImageCol.Add img 'добавляем объект картинки в коллекцию
        Set img = Nothing
        i = i + 1
    Next
    End Sub

    Вроде так. У меня работает.

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите кто-нибудь, пожалуста, как поправить даный код.
    К нему есть два вопроса:
    1. Как правильно вызвать функцию, чтобы она вернула текстовое значение.
    2. Есть набор ComboBox, в которые всталяем значения. Как можно закрутить этот кусочек в цикл, подставляя в каждом номер комбобокса. (В реальной задаче их больше 50). Комбобоксы находятся прямо на листе, а не в форме.
     
     
    -------------------------------
    Function diapazon() ' Функция выбирает диапазон непустых клеток
     Dim a As Boolean
     Dim diap As String
     Dim cur_cell As String
     Dim end_cell As String
     Dim i As Integer
     
     i = 1
     While (a = True)
            cur_cell = "A" + LTrim(Str(i))
            If (IsEmpty(Sheets("Лист2").Range(cur_cell).Value) = False) Then
                end_cell = "A" + LTrim(Str(i))
            Else
                a = False
            End If
            i = i + 1
     Wend
     
     diapazon = "A1:" + end_cell
     
    End Function
    ---------
    Private Sub Workbook_Open()
     'Здесь как-то нужно вызвать функцию diapazon,  
     'дабы она вернула строковую переменную диапазона
     Dim spets_list As Range
     Set spets_list = Sheets("Лист2").Range(diapazon)
     Dim vars As Variant
     
     For Each vars In spets_list
         Лист1.ComboBox1.AddItem (vars)
         Лист1.ComboBox2.AddItem (vars)
         .................
         Лист1.ComboBoxN.AddItem (vars)
     Next vars
     
    End Sub
    ---------------------------------------------------

    Всего записей: 2 | Зарегистр. 29-09-2006 | Отправлено: 00:01 30-09-2006
    Yuk



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

    Код:
    Set spets_list = Range(Cells(1, 1), Cells(1, 1).End(xlToRight))

    Если добавить Sheets с With получится еще 2.
     
    А если уж так хочется использовать функцию, ее надо вызывать как diapazon().
     
     
    Добавлено:
    А вам правда нужны комбобоксы на листе? Может проще использовать ячейки с раскрывающимся списком?

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