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

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Можно ли открывать файлы в одной процедуре, а писать в них в других? Как в этом случае передать номер файла?  
    Мне надо сделать  
    Open "Test1.txt" For Output As 1
    Open "Test2.txt" For Output As 2
    Open "Test3.txt" For Output As 3
     в главной процедуре а писать в них из многих процедур. Как передать номер файла? И нужно ли вообще передавать?  Т.е. если команда Print #1, txt стоит в другой процедуре, то нужно ли этот самый #1 как-то передать, или и так сработает?


    ----------
    |^^^пиво^^\\|""\\_,_
    |___________||___|__|)
    (@)(@)""*|(@)(@)**(@)

    Всего записей: 3957 | Зарегистр. 27-03-2002 | Отправлено: 06:06 14-01-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vzbzdnov
    Цитата:
    в главной процедуре а писать в них из многих процедур. Как передать номер файла? И нужно ли вообще передавать?  Т.е. если команда Print #1, txt стоит в другой процедуре, то нужно ли этот самый #1 как-то передать, или и так сработает?  

    Ая-яй... А неужели проверить сложно? я вот тоже не знаю, как оно в теории будет, но, проверил - в одной процедуре делаешь open.. as 2
    в другой - print #2 (причём вызывал её несколько раз)
    на закрытие книги - Close #2
    всё работает...

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 12:08 14-01-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Столкнулся с интересной задачей. Есть ячейки формата ##/##. Надо, чтобы число после знака дроби было выделено (например, цветом или шрифтом). Это вообще возможно сделать? Понимаю, что "в лоб" решить не получится, поскольку у ячейки шрифт только 1. Но все-таки наверняка есть обходной маневр...
     
    А, все, решил - в общем, делаем две ячейки вместо одной. В первой остается вся левая часть + знак дроби (т.е. ##/), во вторую выносим число после дроби (##). С первой ячейкой ничего не делаем, во второй ставим нужный формат текста и выравнивание по левому краю. Убираем линии сетки и рисуем границу вокруг двух этих ячеек.
    Вуаля - на вид имеем одну ячейку с выделенным правым числом.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:06 15-01-2007 | Исправлено: The okk, 09:42 15-01-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk вы правильно сделали, что нашли обходной маневр, но, не могу оставить вас в неведении ;-))
    Цитата:
    поскольку у ячейки шрифт только 1.  
    это не так: выделите в строке формул ЧАСТЬ строки и выберите другой шрифт, начертание (жирный, наклонный), размер, цвет...
    получится вот так, например,    

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 11:06 15-01-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    Я пробовал. Но в итоге все форматирование пропадет, когда ячейка станет неактивной. Останется формат, который задан в "Формат ячейки".

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 11:47 15-01-2007 | Исправлено: The okk, 12:07 15-01-2007
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    The okk
    Здарова! Я не знаю как отфильтровать в ListView?
    Здесь коды
    ListBox1.Column() = arrFilt - нормально, а вот ListView1 = arrFilt - не знаю, не работает.

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 13:23 15-01-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Anton T
    Привет.
    ListView1 = arrFilt - это, если не ошибаюсь, попытка записать в выделенный элемент ListView1 (кажется, такое у него свойство по умолчанию) многомерный массив.
    В одно действие многомерный массив в многомерный ListView не прописывается, поскольку он по сути состоит из двух массивов: одномерного массива элементов ListItems и многомерного массива подэлементов SubItems (или, в виде коллекции, ListSubItems). Если оперировать только с ListItems, 100% вероятность потери подэлементов.
    Ты хочешь, чтобы при изменении текстбокса с критерием фильтрации (первыми буквами фамилии), немедленно осуществлялась фильтрация по ListView1. Причем, не просто фильтрация (скрытие элементов), а вырезание всех, не попадающих под критерий, элементов?
    Или в ListView должны попасть все записи с активного листа, удовлетворяющие условию текстбокса?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:53 15-01-2007 | Исправлено: The okk, 15:40 15-01-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    Цитата:
    Я пробовал. Но в итоге все форматирование пропадет, когда ячейка станет неактивной. Останется формат, который задан в "Формат ячейки".
    буду нудным.. а что означает - станет неактивной? У меня вроде всё работает...
       
    что я делаю не так? ;-)))

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 17:13 15-01-2007
    Pantera3587

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    На листе 1 есть данные. Выделяем этот диапазон с данными и копируем его на лист2. Написала код, но он не работет. Кто подскажет, где ошибка. Вот код:
     
    Sub копирование_диапазона()
     
    Dim d As Variant
    Dim a As Variant
    Dim k As Variant
    Dim b1 As Variant
    Dim b2 As Variant
     
    Set b1 = ThisWorkbook.Worksheets("Лист1") 'на этом листе находятся данные
    Set b2 = ThisWorkbook.Worksheets("Лист2") 'лист на который копировать данные
     
    d = b1.UsedRange.Rows.Count 'выделенный диапазон значений
     
    b1.Activate
     
    k = 1
     
    For a = 1 To d
         
    Range(Cells(a, 1), Cells(a, 2)).Value.Copy b2.Range(Cells(k, 1), Cells(k, 2)).Value
             
    k = k + 1
     
    Next
     
    b2.Activate
     
    End Sub

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 20:35 15-01-2007
    Anton T

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

    Цитата:
    Ты хочешь, чтобы при изменении текстбокса с критерием фильтрации (первыми буквами фамилии), немедленно осуществлялась фильтрация по ListView1.

    Да

    Цитата:
    ричем, не просто фильтрация (скрытие элементов), а вырезание всех, не попадающих под критерий, элементов?

    Как получиться.

    Цитата:
    Или в ListView должны попасть все записи с активного листа, удовлетворяющие условию текстбокса?

    Да.
     
    Добавлено:
    Pantera3587
    Юмористь!
    Сейчас дам код.

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 21:09 15-01-2007
    The okk



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

    Цитата:
    что я делаю не так?  

    Используешь версию 2003
     
    Pantera3587

    Код:
     
    Sub Copy_Range()
    Dim lRowsCount As Long, lColCount As Long
     
    'работаем с листом1
    With Worksheets("Лист1")
    'определяем количество используемых строк
        lRowsCount = .UsedRange.Rows.Count
    'и столбцов
        lColCount = .UsedRange.Columns.Count
    'в диапазон первого листа, совпадающий по размеру с
    'используемым диапазоном первого листа записываем
    'весь используемый диапазон первого листа
        Worksheets("Лист2").Range(Cells(1, 1), _
        Cells(lRowsCount, lColCount)) = .UsedRange
    End With
     
    End Sub

    Наверное, вот так...
     
    Добавлено:
    Anton T
    ок. Завтра днем напишу код.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 21:19 15-01-2007
    Anton T

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

    Код:
     
    Sub rrr()
    Range("a1", "b1").CurrentRegion.Copy Sheets(2).Range("B1")
    End Sub
     

     
    The okk
    ок.
     
    Добавлено:
    Pantera3587
    или точнее:

    Код:
    Sub OneColumnDyaRange()
        Range("A1", Range("A65536").End(xlUp)).Copy Sheets(2).Range("a1")
        Range("b1", Range("b65536").End(xlUp)).Copy Sheets(2).Range("b1")
    End Sub


    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 22:12 15-01-2007
    crewgehr

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте!
     
    Есть вот такой дико неправильный код:
     
    Range("B1:H1").Select
      selection.Copy
    Range("I1").Select
      selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=True
     
    А задача состоит в следующем: через каждые 10 строк в столбцах B:H содержатся некие данные, которые нужно вставить в транспонированном виде в соответствующую строку в столбце I.
    Я пытался реализовать сие через что-то типа For r=1 to 500 step 10 и т.д., но ничего не получилось )))
    Помогите, пожалуйста.

    Всего записей: 6 | Зарегистр. 19-12-2006 | Отправлено: 02:02 16-01-2007
    vzbzdnov



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

    Цитата:
    Ая-яй... А неужели проверить сложно? я вот тоже не знаю, как оно в теории будет, но, проверил - в одной процедуре делаешь open.. as 2, в другой - print #2 (причём вызывал её несколько раз) на закрытие книги - Close #2 всё работает...  

    Сделал по другому - передаю номер
    Open ... As 2
    Call mysub(parms,2)
    sub mysub (parms, Nbr As integer)
    print #Nbr .....
     
    Работает

    ----------
    |^^^пиво^^\\|""\\_,_
    |___________||___|__|)
    (@)(@)""*|(@)(@)**(@)

    Всего записей: 3957 | Зарегистр. 27-03-2002 | Отправлено: 07:43 16-01-2007 | Исправлено: vzbzdnov, 07:50 16-01-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Anton T
    Данные на листе отсортированы? По фамилии? Сортировка допустима? - Это позволит не проходить по всему листу (тем более - через цикл), а сразу перейти к первому совпадению (если совпадение есть) и идти от него вниз.
     
    Добавлено:
    Возник вопрос - как на пользовательский тулбар (не форму!) скриптом добавить: CheckBox и ToggleButton. Вообще, такое возможно? И если не возможно, то какие есть обходные маневры. Что-то я с утра туго соображаю...
     
    Добавлено:
    crewgehr
    попробуй спросить в теме по Excel. Это делается без VBA:
    1. Задаешь диапазон формулой.
    2. Создаешь формулу массива. {=ТРАНСП(заданный_диапазон)}
    Вот только сам я в диапазонах (Именах) и формулах массивов разбираюсь слабо и точную формулу диапазона сказать не могу.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:33 16-01-2007
    SERGE_BLIZNUK

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

    Цитата:
    что я делаю не так?
    Используешь версию 2003  
    неверно. Вы не правы. я использую Office XP (Excel 2002 SP3).
    И, наличие зоопарка разных компьютеров, позволяет проверить на Excel 97.  
    Там тоже работает:

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 09:47 16-01-2007 | Исправлено: SERGE_BLIZNUK, 09:48 16-01-2007
    Troitsky



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

    Цитата:
    Возник вопрос - как на пользовательский тулбар (не форму!) скриптом добавить: CheckBox и ToggleButton.

    По поводу ToggleButton: насколько представляю добавлять нужно обыкновенную кнопку  (Type:=msoControlButton), и в нужный момент менять ее свойство State.
    С CheckBox как быть не знаю, но, в крайнем случае, можно выкрутиться выполнив его в виде той же кнопки, подобрав подходящую иконку (в виде галки).


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 10:00 16-01-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    А, точно. Нашел. Спасибо!
    В общем, чтобы сделать из ##/## ##/##:
    Код:
     
    Cells(1,1).Characters(Start:=4, Length:=2).ColorIndex = 3

     
    Troitsky
    Спасибо!
    Только для чекбокса надо еще иметь и значок без галки. С галкой я нашел - это 220, 1848 и 3110, а без нее - нету .

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 10:06 16-01-2007 | Исправлено: The okk, 10:16 16-01-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    crewgehr
    Цитата:
    через каждые 10 строк в столбцах B:H содержатся некие данные, которые нужно вставить в транспонированном виде в соответствующую строку в столбце I.  
    ну, раз вы в этом форуме спросили - получите программку ;-))

    Код:
     
    Sub MyTranspose()
      cB = 2
      cH = 8
      cI = 9
      Row1 = ActiveWorkbook.ActiveSheet.UsedRange.Row
      Row2 = Row1 + ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count - 1
      For i = Row1 To Row2 Step 10
        If Not IsEmpty(Cells(i, cB)) Then
          For j = cB To cH
            Cells(i + j - cB, cI).Value = Cells(i, j).Value
          Next j
        End If
      Next i
    End Sub
     

    Примечание.
    Как сказал The okk,
    Цитата:
    Это делается без VBA
    Полностью согласен. Это ТОЧНО можно решить через формулы - преимущество - при изменении данных в ваших B:H в столбце I будет изменяться автоматически!
    Но... тут надо думать и разбираться. Если вы читаете по английски, попробуйте сходить сюда

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 10:10 16-01-2007 | Исправлено: SERGE_BLIZNUK, 10:16 16-01-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Интересная задача появилась на Daily Dose of Excel.
    Смысл сводится к тому, чтобы для двух строк подобрать наиболее подробный шаблон/маску. Например, есть два слова: "предприятие" и "предприниматель", для них наиболее подробный шаблон будет по идее: "предпри*т*". Но тот алгоритм, что там реализован, сверяет только символы в совпадающих позициях (т.е. первый с первым, второй со вторым и т.д.), что приводит к тому, что шаблон для слов "правильный" и "неправильный" вообще нулевой, хотя должен быть "*правильный". Если у кого какие мысли - высказывайтесь.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:33 16-01-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