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

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



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    alin
    например, попробовать обойтись без всяких выделений-копирований-вставок подобным образом:
    Код:
        Range("BD25").Value = Range("BD30").Value
        Range("BE25").Value = Range("BE30").Value
        Range("BF25").Value = Range("BF30").Value
        Range("BG25").Value = Range("BG30").Value

     
     
    Добавлено:
    Кстати, если у тебя формулы уже один раз в ячейки BD25:BG25 прописаны, может не имеет смысла их повторно писать?
    И зачем
    Код:
        ToggleButton3.Value = False
    после Else? вроде, и без присвоения свойство Value кнопки будет равно False.


    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 12:29 18-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    alin
    Может, будет проще, если ты скажешь, что должен делать макрос?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:11 18-12-2006
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Спасибо, работает как часы!
     
    Private Sub ToggleButton3_Click()
    If ToggleButton3.Value = True Then
        Range("BD30").Formula = "=BD21-BD23-BD24"
        Range("BE30").Formula = "=BE21-BE23-BE24"
        Range("BF30").Formula = "=BF21-BF23-BF24"
        Range("BG30").Formula = "=BG21-BG23-BG24"
        Range("BD25:BG25").Value = Range("BD30:BG30").Value
        Else
        Range("BD25:BH25").ClearContents
    End If
    End Sub
     
    Добавлено:
    The okk
    ЗдесьПодробнее...  

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 13:17 18-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Можешь изобразить пример, как через СМЕЩ и ПОИСКПОЗ (они же offset и match) искать в неограниченном несортированном массиве:
    как должна выглядеть формула поиска, если в первом листе:
    СтолбецA     СтолбецB
    777              Доски
    555              Компьютеры
    666              Плюшевый сатана
    911              Набор юного спасателя
    ... в общем, длинный такой список номенклатуры, размер которого не ограничен и может растягиваться.
     
    А во втором листе просто числа:
    СтолбецA
    911
    555
    И надо подставить в столбецB наименование товара через поиск.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:52 18-12-2006
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    Если не ошибаюсь, на другой странице ПОИСКПОЗ работать не будет. И данные в столбце А, вэтом случае, должны быть упорядочены по возростающей.

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 14:05 18-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    alin
    Чтобы работало на другой странице, можно присвоить диапазону имя - обычно работает.
    А что до сортировки, так ПОИСКПОЗ и нужен как раз там, где массив не сортированный. Иначе применил бы ВПР или ПРОСМОТР - и не надо было бы всякие СМЕЩ и ИНДЕКС брать.
     
    Добавлено:
    Все, сорри, уже в другой теме разобрались

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:16 18-12-2006
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Если вычисления в таблице Excel происходят автоматически, можно ли макросом приостановить вычисления, а затем запустить вычисления?
    The okk
    ОК!

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 15:38 18-12-2006 | Исправлено: alin, 15:39 18-12-2006
    The okk



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

    Код:
     
    Application.Calculation = xlCalculationManual 'отменяем автокалькуляцию

    А на счет "запустить" я не понял. Вернуть автокалькуляцию? - тогда:

    Код:
    Application.Calculation = xlCalculationAutomatic

    Если автокалькуляцию не включать, а просчитывать только выбранные диапазоны, то у всех объектов есть метод Calculate.
     

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 15:50 18-12-2006
    aalleexxaa



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

    Всего записей: 16 | Зарегистр. 09-07-2006 | Отправлено: 16:15 18-12-2006
    alin



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

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 16:41 18-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Столкнулся с таким глюком в ListView:
    У меня на форме две страницы. На обеих по одному Listview с чекбоксами.
    Ставлю галочку в первый чекбокс на первой странице, переключаюсь на вторую, потом опять на первую - чексоксы исчезли из виду, вместо них пустое место.  
    Если по ним покликать, они станут видны, но меня такое положение не устраивает. Почему не работает нормально?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:30 19-12-2006
    aks sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите решить такую проблемму. Имеется таблица с данными сотрудников. ФИО (только) отображаются в ListBox на форме. На форме имеются две кнопки "вверх" и "вниз" при помощи которых в ListBox перемещаются ФИО и кнопка "ОК". Как сделать, чтобы при нажатии "ОК" измененные положения ФИО в ListBox изменили расположение  данных сотрудников в таблице. Заранее благодарен.

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 09:48 19-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aks sv
    насколько я понял, количество не меняется, а меняется только порядок. Так? тогда по нажатию на ОК можно просто заполнить диапазон листа, где лежат ФИО, данными из listbox. По-моему, это гораздо проще, чем отслеживать (или, не дай бог, искать), что изменилось, а потом долго и упорно по каждому изменению делать кучу действий по перестановке записи на листе.
    Я listbox сейчас не использую (ListView намного мощнее), но помнится мне, там была такая фишка, как RowSource. Ты ListBox через нее заполнял?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 10:10 19-12-2006
    aks sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Antananarivu
    Можешь поподробнее описать как ты сделал смену раскладки клавиатуры с англ. на русскую  
     
    Добавлено:
    The okk
    Дело в том, что в ListBox заполняются только ФИО с помощью AddItem, а данные на сотрудников в Label при выделении в ListBox ФИО:
     
    Private Sub ListBox1_Click()
        Dim EmpFound As Range
        With Range("EmpList")
            Set EmpFound = .Find(ListBox1.Value)
            If EmpFound Is Nothing Then
                Label2.Caption = ""
            Else
                With EmpFound
                    Label2.Caption = " Имя: " & .Offset(, 2).Value & vbLf & _
                                    " Отчество: " & .Offset(, 3).Value & vbLf & _
                                    " Должность: " & .Offset(, 4).Value & vbLf & _
                                    " Принят на работу: " & .Offset(, 5).Value & vbLf & _
                                    " Оклад:" & .Offset(, 6).Value & vbLf & _
                                    " Табельный номер:" & .Offset(, 7).Value
                End With
            End If
        End With
    End Sub

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 10:16 19-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aks sv
    Ну, тогда придется заполнять лист из того, что есть - то бишь из Label
    Как вариант могу предложить:
    1. сделать некий спрятанный (visible = false) лист-справочник, где будут все работники и их данные в любом порядке.
    2. Сделать видимый лист таким образом:
    столбецA   СтолбецБ и т.д.
    Фамилия1  формула1
    Фамилия2  формула2
    Фамилия3  формула3
    ....
     
    Формула = ИНДЕКС(массив_в_первом_листе;ПОИСКПОЗ(A1;массив_в_первом_листе;0);номер_столбца)
     
    Тут:
    массив в первом листе - это диапазон на скрытом листе, где размещены справочные данные.
    A1 - это ссылка на ячейку.
    номер столбца - ну, собственно, и есть номер столбца. Для Имени - 2, для отчества - 3 и т.д.
    Формула находит по фамилии, указанной в столбце А, все данные сотрудника.
     
    При такой организации можно смело вертеть столбцом А видимого листа. В частности, записывать в него Item'ы из Listbox, а вся остальная часть таблицы будет мгновенно перестраиваться сама, благодаря формуле.
     
    Добавлено:
    Как определить количество используемых строк в отдельно взятом столбце? (как UsedRange для листа)?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 11:12 19-12-2006
    aks sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    Спасибо за совет, попробую.
    На твой вопрос, если я правильнр понял:
     
    Sub Число_строк()
        Dim LastRow As Long
        LastRow = Range("A65536").End(xlUp).Row
        MsgBox "Число строк" & LastRow
    End Sub

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 12:49 19-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aks sv
    ок. спс.
     
    Добавлено:
    Вот пример с ListView. Запустите макрос testform. В форме перейдите сначала на 2 потом опять на 1 страницу. - Чекбоксы пропадают. Самое плохое - при переходе от одной страницы к другой они еще ВСЕ устанавливаются в True.
     
    Кто-нибудь знает, как это исправить?
     
    Добавлено:
    Устранил проблему. Вот как "лечил":
    сделал событие - когда меняется чекбокс, сделать Item жирным.
    Другое событие - при смене страницы все жирные сделать выделенными (Checked = True), остальные сделать не выделенными (Checked = False)
     
    Добавлено:
    Теперь разбираюсь, как мне удалить выбранный элемент.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:10 19-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    С удалением разобрался - не заметил, что там метод ListItems.Remove аргумент требует, поэтому искал метод для ListItem
    В итоге, чтобы удалить выбранный (Selected) элемент, надо:

    Код:
    ListView1.ListItems.Remove(SelectedItem.Index)

    Теперь другая задача. Надо:
    1. Менять два соседних элемента (ну как обычно - при нажатии на стрелочку элемент в списке поднимается либо опускается)
    2. Вставлять новый элемент перед выделенным.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:24 20-12-2006
    aks sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    Никогда не использовал ListView, вышли мне код помылу: asv_99@mail.ru

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 12:25 20-12-2006
    jONES1979



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

    Цитата:
    Antananarivu  
    Можешь поподробнее описать как ты сделал смену раскладки клавиатуры с англ. на русскую  

     
    Итак, как на VBA делать смену раскладки:

    Код:
     
    Public Const HKL_NEXT = 1
    Public Const HKL_PREV = 0
     
    Public Const kb_lay_ru = 68748313
    Public Const kb_lay_en = 67699721
     
    Public Declare Function ActivateKeyboardLayout Lib "user32" ( _
      ByVal HKL As Long, _
      ByVal flags As Long) As Long
     
      ' Так активируем следующую             'ActivateKeyboardLayout HKL_NEXT, 0
      ' Или так. Активируем предыдущую.   'ActivateKeyboardLayout HKL_PREV, 0
     
    Public Sub ActivateKeyboardLayoutRU()
       ActivateKeyboardLayout kb_lay_ru, 0
    End Sub
     
    Public Sub ActivateKeyboardLayoutEN()
      ActivateKeyboardLayout kb_lay_en, 0
    End Sub
     

     
    Соответственно, для переключения на русский вызываем ActivateKeyboardLayoutRU()

    Всего записей: 324 | Зарегистр. 20-05-2005 | Отправлено: 13:05 20-12-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